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方法,貌似因爲字段的問題沒有實現出來。

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