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