默认情况下,DataView 是数据的只读视图。但是,可以使用 DataView 来添加、删除或修改基础表中的数据行,方法是设置 DataView 的三个 Boolean 属性之一。这些属性为 AllowNewAllowEditAllowDelete。默认情况下,它们设置为 true,这使您能够指定是否可修改 DataView 的基础 DataTable 中的数据。

如果 AllowNewtrue,则可以使用 DataView AddNew 方法来创建新的 DataRowView。请注意,在调用 DataRowViewEndEdit 方法之前,新行实际上不会添加到基础 DataTable 中。如果调用 DataRowViewCancelEdit 方法,则将丢弃新行。另请注意,一次只能编辑一个 DataRowView。如果在存在挂起行时调用 DataRowViewAddNewBeginEdit 方法,则会对该挂起行隐式调用 EndEdit。当调用 EndEdit 时,更改将应用于基础 DataTable,并且随后可以使用 DataTableDataSetDataRow 对象的 AcceptChangesRejectChanges 方法来提交或拒绝更改。如果 AllowNewfalse,则当调用 DataRowView AddNew 方法时,将引发异常。

如果 AllowEdittrue,可以通过 DataRowView 来修改 DataRow 的内容。您可以使用 DataRowView.EndEdit 确认对基础行的更改,或使用 DataRowView.CancelEdit 拒绝更改。请注意,一次只能编辑一行。如果在存在挂起行时调用 DataRowViewAddNewBeginEdit 方法,则将对挂起行隐式调用 EndEdit。当调用 EndEdit 时,建议更改将放置在基础 DataRowCurrent 行版本中,随后可以使用 DataTableDataSetDataRow 对象的 AcceptChangesRejectChanges 方法来提交或拒绝这些更改。如果 AllowEditfalse,则当试图修改 DataView 中的值时,将引发异常。

当编辑现有 DataRowView 时,仍将引发基础 DataTable 的事件,并提供建议更改。请注意,如果对基础 DataRow 调用 EndEditCancelEdit,那么无论是否对 DataRowView 调用 EndEditCancelEdit,都将应用或取消挂起的更改。

如果 AllowDeletetrue,则可以使用 DataViewDataRowView 对象的 Delete 方法删除 DataView 中的行,这些行也将从基础 DataTable 中删除。随后可以分别使用 AcceptChangesRejectChanges 来提交或拒绝删除。如果 AllowDeletefalse,当调用 DataViewDataRowViewDelete 方法时,将引发异常。

以下代码示例禁用通过 DataView 删除行的功能,并使用 DataView 向基础表中添加新行。

Dim custTable As DataTable = custDS.Tables("Customers")
Dim custView As DataView = custTable.DefaultView
custView.Sort = "CompanyName"

custView.AllowDelete = False

Dim newDRV As DataRowView = custView.AddNew()
newDRV("CustomerID") = "ABCDE"
newDRV("CompanyName") = "ABC Products"
newDRV.EndEdit()

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();