数据表编辑

当您在 DataRow 中更改列值时,所做更改会立即置于行的当前状态中。 将 DataRowState 设置为“已修改”,并使用 AcceptChangesRejectChanges 方法接受或拒绝这些更改。 提供了DataRow三种方法,可用于在编辑行时暂时中止该行的状态。 这些方法是 BeginEditEndEditCancelEdit

直接在DataRow中修改列值时,DataRow通过当前默认Original行版本来管理这些列值。 除了这些行版本, BeginEditEndEditCancelEdit 方法还使用第四行版本: 建议。 有关行版本的详细信息,请参阅 行状态和行版本

Proposed 版本存在于通过调用 BeginEdit 开始的编辑操作期间,在此期间可以通过使用 EndEditCancelEdit, 或通过调用 AcceptChangesRejectChanges 来结束。

在编辑操作期间,可以在 DataTableColumnChanged 事件中,通过检查 ProposedValue 对每个列应用验证逻辑。 该 ColumnChanged 事件保存 DataColumnChangeEventArgs 对正在更改的列和 ProposedValue 的引用。 评估建议的值后,可以修改该值或取消编辑。 编辑结束时,该行将移出 Proposed 状态。

可以通过调用 EndEdit 来确认编辑,也可以通过调用 CancelEdit 来取消编辑。 请注意,虽然 EndEdit 确实确认了编辑,但 DataSet 直到调用 AcceptChanges 后,才会实际接受这些更改。 另请注意,如果在使用 EndEditCancelEdit 结束编辑之前调用 AcceptChanges,编辑将结束,并且 Proposed 行值会被同时接受到 CurrentOriginal 行版本中。 同样,调用 RejectChanges 结束编辑并放弃 CurrentProposed 行版本。 调用EndEditCancelEdit在调用AcceptChangesRejectChanges之后没有效果,因为编辑已结束。

以下示例演示如何使用BeginEditEndEdit以及CancelEdit。 该示例还会检查 ProposedValue 事件 ColumnChanged 中的内容,并确定是否取消编辑。

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

另请参阅