数据表编辑
当您在 DataRow 中更改列值时,所做更改会立即置于行的当前状态中。 然后,DataRowState 会设置为 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 之前,数据集并没有实际接受更改。 另外请注意,如果在使用 EndEdit 或 CancelEdit 结束编辑之前调用 AcceptChanges,编辑将会结束,并接受 Current 和 Original 行版本的 Proposed 行值。 同样,调用 RejectChanges 也会结束编辑,并放弃 Current 和 Proposed 行版本。 在调用 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();
}
}