当您在DataRow中更改列值时,所做更改会立即置于行的Current状态中。然后,RowState会设置为Modified,并使用DataRow的AcceptChanges或RejectChanges方法来接受或拒绝所做更改。DataRow还提供了三种可用于在编辑行时将行的状态挂起的方法。这些方法是BeginEdit、EndEdit和CancelEdit。
当您直接在DataRow中修改列值时,DataRow会使用Current、Default和Original行版本来管理列值。除这些行版本以外,BeginEdit、EndEdit和CancelEdit方法还使用第四个行版本:Proposed。
在执行编辑操作(通过调用BeginEdit开始,并且通过使用EndEdit或CancelEdit或者通过调用AcceptChanges或RejectChanges结束)的过程中,Proposed行版本会存在。
在编辑操作过程中,您可以通过计算DataTable的ColumnChanged事件中的ProposedValue来将验证逻辑应用于各列。ColumnChanged事件保存DataColumnChangeEventArgs,可保持对正在更改的列和ProposedValue的引用。计算了建议值后,可以对其进行修改或取消编辑。编辑结束时,行从Proposed状态中移出。
您可以通过调用EndEdit来确认编辑,也可以通过调用CancelEdit来取消编辑。请注意,尽管EndEdit确实已确认您所做的编辑,但在调用AcceptChanges之前,DataSet并没有实际接受更改。另外请注意,如果在EndEdit或CancelEdit编辑结束之前调用AcceptChanges,编辑将会终止,并接受Current和Original行版本的Proposed行值。调用RejectChanges会以同样的方式结束编辑,并放弃Current和Proposed行版本。在调用AcceptChanges或RejectChanges之后调用EndEdit或CancelEdit不会起作用,因为编辑已经结束。
以下示例演示了如何将BeginEdit与EndEdit和CancelEdit一起使用。本示例也会检查ColumnChanged事件中的ProposedValue,并决定是否取消编辑。
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();
}
}