當您在DataRow中修改列值時,這些變更會立即反映在行的當前狀態中。 DataRowState 接著會被設定為 已修改,並且使用 AcceptChanges 方法或 RejectChanges 方法來接受或拒絕 DataRow 的變更。 DataRow 也提供三種方法,可讓您在編輯數據列時暫停數據列的狀態。 這些方法是 BeginEdit、 EndEdit與 CancelEdit。
當您直接修改 DataRow 中的數據行值時, DataRow 會使用 Current、 Default 和 Original 數據列版本來管理數據行值。 除了這些數據列版本之外, BeginEdit、 EndEdit 和 CancelEdit 方法也會使用第四個數據列版本: 建議。 如需數據列版本的詳細資訊,請參閱 數據列狀態和數據列版本。
提案列版本存在於編輯操作從呼叫 BeginEdit 開始時,並且可以在使用 EndEdit 或 CancelEdit 結束,或通過呼叫 AcceptChanges 或 RejectChanges 進行結束。
在編輯作業期間,您可以藉由評估 DataTable 的 ColumnChanged 事件中的 ProposedValue,將驗證邏輯套用至個別數據行。 ColumnChanged 事件會保存 DataColumnChangeEventArgs,其會保留對正在變更的數據列的參考,以及對擬議值的參考。 評估建議的值之後,您可以修改或取消編輯。 編輯結束時,數據列會移出建議狀態。
您可以呼叫 EndEdit 來確認編輯,也可以呼叫 CancelEdit 來取消編輯。 請注意,雖然 EndEdit 確實確認您的編輯,但呼叫 AcceptChanges 之前,DataSet 實際上不會接受變更。 另請注意,如果您在結束編輯之前呼叫AcceptChanges,也就是說在EndEdit 或 CancelEdit 之前,編輯就會結束,而且目前和原始數據列版本都會接受建議的數據列值。 同樣地,呼叫 RejectChanges 會結束編輯,並捨棄 目前版本 和 建議版本 的列版本。 呼叫 AcceptChanges 或 RejectChanges 之後呼叫 EndEdit 或 CancelEdit 沒有任何作用,因為編輯已經結束。
下列範例示範如何搭配 EndEdit 和 CancelEdit 使用 BeginEdit。 此範例也會檢查 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();
}
}
另請參閱
- DataRow
- DataTable
- DataRowVersion
- 操作 DataTable 中的數據
- 處理資料表事件
- ADO.NET 概觀