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