DataTable 编辑

更新:November 2007

当您在 DataRow 中更改列值时,所做更改会立即置于行的当前状态中。 然后,DataRowState 会设置为 Modified,并使用 DataRowAcceptChangesRejectChanges 方法来接受或拒绝所做更改。 DataRow 还提供了三种可用于在编辑行时将行的状态挂起的方法。 这三个方法是 BeginEditEndEditCancelEdit

当您直接在 DataRow 中修改列值时,DataRow 会使用 CurrentDefaultOriginal 行版本来管理列值。 除了这些行版本之外,BeginEditEndEditCancelEdit 方法使用第四种行版本: Proposed。有关行版本的更多信息,请参见行状态与行版本

在执行编辑操作(通过调用 BeginEdit 开始,并且通过使用 EndEditCancelEdit 或者通过调用 AcceptChangesRejectChanges 结束)的过程中,Proposed 行版本会存在。

在编辑操作过程中,您可以通过计算 DataTableColumnChanged 事件中的 ProposedValue 来将验证逻辑应用于各列。 ColumnChanged 事件保存 DataColumnChangeEventArgs,可保持对正在更改的列和 ProposedValue 的引用。 计算了建议值后,可以对其进行修改或取消编辑。 编辑结束时,行从 Proposed 状态中移出。

您可以通过调用 EndEdit 来确认编辑,也可以通过调用 CancelEdit 来取消编辑。 请注意,尽管 EndEdit 确实已确认您所做的编辑,但在调用 AcceptChanges 之前,DataSet 并没有实际接受更改。 另外请注意,如果在使用 EndEditCancelEdit 结束编辑之前调用 AcceptChanges,编辑将会结束,并接受 CurrentOriginal 行版本的 Proposed 行值。 同样,调用 RejectChanges 也会结束编辑,并放弃 CurrentProposed 行版本。 在调用 AcceptChangesRejectChanges 之后调用 EndEditCancelEdit 不会起作用,因为编辑已经结束。

以下示例演示了如何将 BeginEditEndEditCancelEdit 一起使用。 本示例还会检查 ColumnChanged 事件中的 ProposedValue,并决定是否取消编辑。

Dim workTable As DataTable = New DataTable
workTable.Columns.Add("LastName", Type.GetType("System.String"))

AddHandler workTable.ColumnChanged, _
  New DataColumnChangeEventHandler(AddressOf OnColumnChanged)

Dim workRow As DataRow = workTable.NewRow()
workRow(0) = "Smith"
workTable.Rows.Add(workRow)

workRow.BeginEdit()
' Causes the ColumnChanged event to write a message and cancel the edit.
workRow(0) = ""     
workRow.EndEdit()

' Displays "Smith, New".
Console.WriteLine("{0}, {1}", workRow(0), workRow.RowState)  


Private Shared Sub OnColumnChanged( _
  sender As Object, args As DataColumnChangeEventArgs)
  If args.Column.ColumnName = "LastName" Then
    If args.ProposedValue.ToString() = "" Then
      Console.WriteLine("Last Name cannot be blank.  Edit canceled.")
      args.Row.CancelEdit()
    End If
  End If
End Sub
DataTable workTable  = new DataTable();
workTable.Columns.Add("LastName", typeof(String));

workTable.ColumnChanged += 
  new DataColumnChangeEventHandler(OnColumnChanged);

DataRow workRow = workTable.NewRow();
workRow[0] = "Smith";
workTable.Rows.Add(workRow);

workRow.BeginEdit();
// Causes the ColumnChanged event to write a message and cancel the edit.
workRow[0] = "";     
workRow.EndEdit();

// Displays "Smith, New".
Console.WriteLine("{0}, {1}", workRow[0], workRow.RowState);  

protected static void OnColumnChanged(
  Object sender, DataColumnChangeEventArgs args)
{
  if (args.Column.ColumnName == "LastName")
    if (args.ProposedValue.ToString() == "")
    {
      Console.WriteLine("Last Name cannot be blank. Edit canceled.");
      args.Row.CancelEdit();
    }
}

请参见

概念

处理 DataTable 事件 (ADO.NET)

参考

DataRow

DataTable

DataRowVersion

其他资源

在 DataTable 中处理数据