C#开发之DataTable多行数据的合并

案例:
查询得到的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方法,貌似因为字段的问题没有实现出来。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章