当您在 DataRow 中更改列值时,所做更改会立即置于行的当前状态中。 将 DataRowState 设置为“已修改”,并使用 AcceptChanges 的 RejectChanges 或 方法接受或拒绝这些更改。 DataRow 还提供了三种方法,可用于在编辑时暂时保留行的状态。 这些方法是 BeginEdit, EndEdit和 CancelEdit。
直接修改 DataRow 中的列值时, DataRow 会使用 “当前”、“ 默认”和 “原始 ”行版本管理列值。 除了这些行版本, BeginEdit、 EndEdit 和 CancelEdit 方法还使用第四行版本: 建议。 有关行版本的详细信息,请参阅 行状态和行版本。
在执行编辑操作(通过调用 BeginEdit 开始,并且通过使用 EndEdit 或 CancelEdit 或者通过调用 AcceptChanges 或 RejectChanges 结束)的过程中,Proposed 行版本会存在。
在编辑作期间,可以通过在 DataTable 的 ColumnChanged 事件中评估 ProposedValue,将验证逻辑应用于各个列。 ColumnChanged 事件保存 DataColumnChangeEventArgs,该事件保留对正在更改的列和 ProposedValue 的引用。 评估建议的值后,可以修改该值或取消编辑。 编辑结束时,行从 Proposed 状态中移出。
可以通过调用 EndEdit 来确认编辑,也可以通过调用 CancelEdit 来取消编辑。 请注意,虽然 EndEdit 确实确认了编辑,但 DataSet 在调用 AcceptChanges 之前实际上不会接受更改。 另请注意,如果在使用 EndEdit 或 CancelEdit 结束编辑之前调用 AcceptChanges,则编辑会结束,并且当前和原始行版本都接受拟议的行值。 同样,调用 RejectChanges 将结束编辑,并放弃 当前 和 建议 的行版本。 调用 AcceptChanges 或 RejectChanges 后调用 EndEdit 或 CancelEdit 不起作用,因为编辑已结束。
以下示例演示如何将 BeginEdit 与 EndEdit 和 CancelEdit 配合使用。 该示例还会检查 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();
}
}