DataTable 儲存記憶體資料但無法直接呈現。DataView 如同「杯子裝水」——提供資料的可視化視圖,支援排序、篩選、編輯等操作。DefaultView 是 DataTable 自動建立的預設視圖。
DataView dv = new DataView(table2); // 為 table2 建立視圖
dv.Sort = "bookname"; // 設定排序欄位
GridView2.DataSource = dv; // 繫結至視圖而非 DefaultView
GridView2.DataBind();
關鍵點: 對 dv 排序後,必須繫結 dv 而非 DefaultView 才會生效。
dv.Sort = DropDownList1.SelectedItem.Text; // 依使用者選擇欄位排序
DataRowView drv = dv.AddNew();
drv["id"] = 100; drv["tb1_id"] = 2; drv["bookname"] = "張愛玲散文集";
GridView2.DataSource = dv; GridView2.DataBind();
dv.Delete(dv.Count - 1); // 刪除最後一列
dv[0]["bookname"] = "如來神掌"; // 修改第 0 列的 bookname
dv.Sort = "bookname";
int index = dv.Find("追風箏的人"); // 回傳索引位置
dv.RowFilter = "bookname='大學英語'"; // 僅顯示符合條件的列
dv.RowStateFilter = DataViewRowState.Deleted; // 顯示已刪除的列
// 需先呼叫 table2.AcceptChanges() 建立基準版本
DataView 透過標記而非實際刪除資料,可檢視刪除/新增/修改前後狀態。
DataSet 由 DataTable 與 Relations 組成。建立父子關聯:
DataRelation tb12 = new DataRelation("tb12",
ds.Tables["tb1"].Columns["id"], ds.Tables["tb2"].Columns["tb1_id"]);
ds.Relations.Add(tb12);
DataRow dr = ds.Tables["tb1"].Rows[rowIndex];
DataRow[] childRows = dr.GetChildRows("tb12"); // 取得該父列對應的所有子列
foreach (DataRow cdr in childRows) {
dt.Rows.Add(dr["name"], cdr["bookname"]); // 組合顯示
}
手動建構 DataSet 僅適合測試。實際開發需從資料庫載入資料至 DataSet、離線處理後批量更新。下一篇將深入 SqlDataAdapter 高效填充與更新技巧。