这次在做项目中,遇到了这样一个问题:datable中列头的名字是不确定的,从数据库中动态查出来的,假设为typeDATA,行的数据中又包含了列头的信息,并按固定的字段分组,当查处行的数据之后用来填充每列的值,用来统计对应的列的信息,如下:
//查处获取列的表头的数据
public DataTable typeDATA
{
get {
StringBuilder typeString = new StringBuilder(@"SELECT [ID] ,[Name] FROM a");
string Typequery = string.Format(typeString.ToString());
return DbHelperSQL.Query(Typequery).Tables[0];
}
}
//行的table数据并进行列的数据填充和转换
DataTable dt = new DataTable(); StringBuilder cnnString = new StringBuilder(@"select No, Name '类型',COUNT(No ) as '个数' from b inner join PersonPlan on viewHandAll .LineId=PersonPlan .ID group by No,Name"); StringBuilder sbWhere = new StringBuilder(); string query = string.Format(cnnString.ToString(), 1, (this.PageIndex - 1) * this.Rows + 1, this.PageIndex * this.Rows); var data = DbHelperSQL.Query(query).Tables[0]; DataColumn dc = null; //添加表头数据
foreach (DataRow item in typeData.Rows) { dt.Columns.Add(item["Name"].ToString(), Type.GetType("System.String")); } //k用来和前一行进行比较,看是否与下一行的数据相同,但对应的列的值是不同的,若是同一种数据但不同的列值,则只做添加一行数据处理,不能添加多行,但行的数据要填充到不同的列中
int k = -1; for (int i=0;i<data.Rows.Count;i++) { DataRow row = dt.NewRow(); for (int j = 0; j < typeData.Rows.Count; j++) { if (data.Rows[i]["类型"].ToString() == typeData.Rows[j]["Name"].ToString()) { row[typeData.Rows[j]["Name"].ToString()] = data.Rows[i]["个数"].ToString(); } } k++; if (k>0 && data.Rows[k]["No"] == data.Rows[i]["No"]) //set as the same row but different column when current row is the same as second. { i++; continue; } dt.Rows.Add(row); }