案例:
查詢得到的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方法,貌似因爲字段的問題沒有實現出來。