案例:
查询得到的DataTable比如:
想要显示的结果是按照时间点为依据,将多条记录显示到一行上,如图:
出现该情况的原因是直接查询得到的DataTable是根据数据库表的设计显示的,该type类型会有很多,也可以自定义一些类型,所有不能将其每个类型作为表的字段名设计。但是在界面层显示时希望将在同一时间点的多条记录显示在一起,方便修改等操作。
实现的方法是重新新建一个DataTable,设计好表头,遍历旧表的数据添加到新表中。
//直接查询的记录
DataSet ds=new DataSet();
//DataTable整理数据
//DataTabe表头显示
DataTable da = new DataTable("newDataTable");
da.Columns.Add("时间", System.Type.GetType("System.String"));
da.Columns.Add("脉搏", System.Type.GetType("System.String"));
da.Columns.Add("呼吸", System.Type.GetType("System.String"));
Hashtable ht = new Hashtable();
int size = 0;
//ds记录的行数
size = ds.Tables[0].Rows.Count;
//ds记录分组
for (int i = 0; i < size; i++) {
DateTime time =DateTime.Parse( ds.Tables[0].Rows[i]["time"].ToString().Trim());//记录时间
string key = time.GetDateTimeFormats('s')[0].ToString();//采用一致的时间格式
//记录类别
string type = ds.Tables[0].Rows[i]["type"].ToString().Trim();
if (!ht.Contains(key) && da.Columns.Contains(type))
{
//不存在时添加
ht.Add(key, "");//key时间
}
}
//newDataTable循环添加新行
for(int i = 0; i < ht.Count; i++) {
//添加一行数据
DataRow dr = da.NewRow();
da.Rows.Add(dr);
}
//newDataTable循环赋值
//newDataTable行号
int count = -1;
foreach (DataRow row in ds.Tables[0].Rows)
{
//源数据该行记录的时间
DateTime time = DateTime.Parse(row["time"].ToString().Trim());
string myTime = time.GetDateTimeFormats('s')[0].ToString();
//记录类别
string type = row["type"].ToString().Trim();
//记录数值
string typeValues = row["number"].ToString().Trim();
if (da.Columns.Contains(type))
{
bool b=false;
//newDataTable时间列是否包含该时间点
foreach(DataRow arow in da.Rows){
if(arow["时间"].ToString().Trim().Equals(myTime)){
b=true;
//index = da.Rows.IndexOf(arow);
}
}
//添加时间
if (ht.Contains(myTime)&&!b)
{
count++;
da.Rows[count]["时间"] = myTime;
}
//添加体征数值
da.Rows[count][type] = typeValues;
}
}
//界面显示
this.dataGridView1.DataSource = da;
以上操作可以实现多行的合并。
对于该问题,也尝试了使用DataTable.Select方法,貌似因为字段的问题没有实现出来。