数据表编辑

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

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

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

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

可以通过调用 EndEdit 来确认编辑,也可以通过调用 CancelEdit 来取消编辑。 请注意,虽然 EndEdit 确实确认了编辑,但 DataSet 在调用 AcceptChanges 之前实际上不会接受更改。 另请注意,如果在使用 EndEditCancelEdit 结束编辑之前调用 AcceptChanges,则编辑会结束,并且当前原始行版本都接受拟议的行值。 同样,调用 RejectChanges 将结束编辑,并放弃 当前建议 的行版本。 调用 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();  
    }  
}  

另请参阅