DataTable 編輯

變更 DataRow 中的資料行值時,這些變更會立即放入資料列的目前狀態中。 DataRowState 接著會設定為 [已修改],並使用 DataRowAcceptChangesRejectChanges 方法接受或拒絕變更。 DataRow 同時提供三種方法,可供您在編輯資料列時用來暫止資料列的狀態。 這些方法是 BeginEditEndEditCancelEdit

當您直接修改 DataRow 的資料行值時, DataRow 會使用 CurrentDefaultOriginal 資料列版本來管理資料行的值。 除了這些資料列版本以外,BeginEditEndEditCancelEdit 方法還使用第四個資料列版本:Proposed。 如需資料列版本的詳細資訊,請參閱資料 列狀態和資料列版本

Proposed 資料列版本會於編輯作業期間存在,而編輯作業會於呼叫 BeginEdit 開始,並且在使用 EndEditCancelEdit 或呼叫 AcceptChangesRejectChanges 時結束。

在編輯作業期間,您可以透過評估 DataTableColumnChanged 事件的 ProposedValue,將驗證邏輯套用到個別的資料行。 ColumnChanged 事件含有 DataColumnChangeEventArgs 其中保存了對變更中資料行的參考和對 ProposedValue 的參考。 在您評估建議的值之後,就可以修改該值或取消編輯。 當編輯作業結束後,資料列將從 Proposed 狀態移除。

您可以呼叫 EndEdit 來確認編輯,或者呼叫 CancelEdit 來取消編輯。 請注意,當 EndEdit 確認您的編輯後,除非呼叫 AcceptChanges,否則 DataSet 並不會真正接受變更。 也請注意,如果您在使用 EndEditCancelEdit 結束編輯作業之前便呼叫 AcceptChanges,編輯作業會結束,而且 CurrentOriginal 這兩個資料列版本都會接受 Proposed 資料列的值。 同樣的,呼叫 RejectChanges 將會結束編輯作業,並放棄 CurrentProposed 資料列版本。 如果您在呼叫 AcceptChangesRejectChanges 之後才呼叫 EndEditCancelEdit,則會因為編輯作業已結束,所以這兩項作業將不會生效。

下列範例展示如何搭配使用 BeginEditEndEditCancelEdit。 此範例也會檢查 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();  
    }  
}  

另請參閱