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

本文介绍如何在C#中处理DataTable,当查询结果按时间点归并多条记录到一行。通过创建新的DataTable并重新设计表头,然后遍历原始数据进行添加,实现了在同一时间点的记录合并,方便数据查看和编辑。尝试使用DataTable.Select方法未成功,重点在于处理不同类型的数据并定制合适的数据展示方式。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值