DataView 使您能夠創建 DataTable 中所存儲的數據的不同視圖,這種功能通常用于數據綁定應用程序。使用 DataView,您可以公開表中具有不同排序順序的數據,并且可以按行狀態或基于篩選器表達式來篩選數據。
DataView 提供數據的動態視圖,其內容、排序和成員關系會實時反映對基礎 DataTable 的更改。它不同于 DataTable 的 Select 方法,后者從表中按特定的篩選器和/或排序順序返回 DataRow 數組,雖然其內容反映對基礎表的更改,但其成員關系和排序卻則保持靜態。DataView 的動態功能使其成為數據綁定應用程序的理想選擇。
與數據庫提供的視圖類似,DataView 為您提供了可向其應用不同排序和篩選條件的單個數據集的動態視圖。但是,DataView 和數據庫視圖之間相當不同的一點在于 DataView 不能作為表來進行處理,并且不能提供聯接表的視圖。另外,還不能排除存在于源表中的列,也不能追加不存在于源表中的列(如計算列)。
可以使用 DataViewManager 來管理 DataSet 中所有表的視圖設置。DataViewManager 為您提供了一種方便的方法來管理每個表的默認視圖設置。在將一個控件綁定到 DataSet 的多個表時,綁定到 DataViewManager 是理想的選擇。
創建:
創建 DataView 的方法有兩種。可以使用 DataView 構造函數,也可以創建對 DataTable 的 DefaultView 屬性的引用。DataView 構造函數可以為空,也可以通過單個參數的形式采用 DataTable 或者同時采用 DataTable 與篩選條件、排序條件和行狀態篩選器。
[C#]
DataView custDV = new DataView(custDS.Tables["Customers"],
"Country = 'USA'",
"ContactName",
DataViewRowState.CurrentRows);
DataView custDV = custDS.Tables["Customers"].DefaultView;
使用 DataView 對數據排序和篩選
DataView 提供了幾項用于對 DataTable 中的數據進行排序和篩選的功能:
[C#]
DataView prodView = new DataView(prodDS.Tables["Products"],
"UnitsInStock <= ReorderLevel",
"SupplierID, ProductName",
DataViewRowState.CurrentRows);
--------------------------------------------------------------------------
查看 DataView 的內容
DataView 公開可枚舉的 DataRowView 對象集合。DataRowView 對象將值公開為 object 數組,這些數組按基礎表中列的名稱或序號引用來編制索引。可以使用 DataRowView 的 Row 屬性來訪問由 DataRowView 公開的 DataRow。
當使用 DataRowView 查看值時,DataView 的 RowStateFilter 屬性將確定公開基礎 DataRow 的哪一個行版本。
[C#]
DataView catView = new DataView(catDS.Tables["Categories"]);
Console.WriteLine("Current Values:");
WriteView(catView);
Console.WriteLine("Original Values:");
catView.RowStateFilter = DataViewRowState.ModifiedOriginal;
WriteView(catView);
public static void WriteView(DataView myView)
{
foreach (DataRowView myDRV in myView)
{
for (int i = 0; i < myView.Table.Columns.Count; i++)
Console.Write(myDRV[i] + "\t");
Console.WriteLine();
}
}
-------------------------------------------------------------------------------------------------------------
使用 DataView 修改數據
可以使用 DataView 在基礎表中添加、刪除或修改數據行。通過設置 DataView 的三個布爾值屬性之一,可以控制使用 DataView 修改基礎表數據的能力。這些屬性為 AllowNew、AllowEdit 和 AllowDelete。默認情況下,它們設置為 true。
如果 AllowNew 為 true,則可以使用 DataView 的 AddNew 方法來創建新的 DataRowView。請注意,在調用 DataRowView 的 EndEdit 方法之前,新行實際上不會添加到基礎 DataTable 中。如果調用 DataRowView 的 CancelEdit 方法,則將丟棄新行。另請注意,一次只能編輯一個 DataRowView。如果在存在掛起行時調用 DataRowView 的 AddNew 或 BeginEdit 方法,則會對該掛起行隱式調用 EndEdit。當調用 EndEdit 時,更改將應用于基礎 DataTable,并且隨后可以使用 DataTable、DataSet 或 DataRow 對象的 AcceptChanges 或 RejectChanges 方法來提交或拒絕更改。如果 AllowNew 為 false,則當調用 DataRowView 的 AddNew 方法時,將引發異常。
如果 AllowEdit 為 true,可以通過 DataRowView 來修改 DataRow 的內容。您可以使用 DataRowView.EndEdit 確認對基礎行的更改,或使用 DataRowView.CancelEdit 拒絕更改。請注意,一次只能編輯一行。如果在存在掛起行時調用 DataRowView 的 AddNew 或 BeginEdit 方法,則將對掛起行隱式調用 EndEdit。當調用 EndEdit 時,建議更改將放置在基礎 DataRow 的 Current 行版本中,隨后可以使用 DataTable、DataSet 或 DataRow 對象的 AcceptChanges 或 RejectChanges 方法來提交或拒絕這些更改。如果 AllowEdit 為 false,則當試圖修改 DataView 中的值時,將引發異常。
當編輯現有 DataRowView 時,仍將引發基礎 DataTable 的事件,并提供建議更改。請注意,如果對基礎 DataRow 調用 EndEdit 或 CancelEdit,那么無論是否對 DataRowView 調用 EndEdit 或 CancelEdit,都將應用或取消掛起的更改。
如果 AllowDelete 為 true,則可以使用 DataView 或 DataRowView 對象的 Delete 方法刪除 DataView 中的行,這些行也將從基礎 DataTable 中刪除。隨后可以分別使用 AcceptChanges 或 RejectChanges 來提交或拒絕刪除。如果 AllowDelete 為 false,當調用 DataView 或 DataRowView 的 Delete 方法時,將引發異常。
以下代碼示例禁用通過 DataView 刪除行的功能,并使用 DataView 向基礎表中添加新行。
[C#]
DataTable custTable = custDS.Tables["Customers"];
DataView custView = custTable.DefaultView;
custView.Sort = "CompanyName";
custView.AllowDelete = false;
DataRowView newDRV = custView.AddNew();
newDRV["CustomerID"] = "ABCDE";
newDRV["CompanyName"] = "ABC Products";
newDRV.EndEdit();