Редактирование таблиц данных

При выполнении изменений значений столбцов в DataRow, изменения немедленно помещаются в текущее состояние строки. Затем DataRowState задано значение "Изменить", и изменения принимаются или отклоняются с помощью AcceptChanges или RejectChanges методов DataRow. DataRow также предоставляет три метода, которые можно использовать для приостановки состояния строки во время редактирования. Такими методами являются: BeginEdit, EndEdit и CancelEdit.

При изменении значений столбцов в DataRow напрямую dataRow dataRow управляет значениями столбцов с помощью версий строк Current, Default и Original. Помимо этих версий строк методы BeginEdit, EndEdit и CancelEdit используют четвертую версию строки: Предлагаемое. Дополнительные сведения о версиях строк см. в разделе "Состояния строк" и "Версии строк".

Предлагаемаяверсия строки существует во время операции редактирования, которая начинается с вызова BeginEdit и заканчивается либо с помощью EndEdit или CancelEdit, либо путем вызова AcceptChanges или RejectChanges.

Во время операции редактирования можно применить логику проверки к отдельным столбцам, оценивая предлагаемое значение в событии ColumnChanged dataTable. Событие ColumnChanged содержит DataColumnChangeEventArgs , которые сохраняют ссылку на столбец, изменяющийся и на предлагаемое значение. После оценки предложенного значения можно изменить его или отменить изменение. После завершения изменения строка перемещается из предлагаемого состояния.

Вы можете подтвердить изменения, вызвав EndEdit или отменив их, вызвав CancelEdit. Обратите внимание, что, хотя EndEdit подтверждает изменения, набор данных фактически не принимает изменения до вызова AcceptChanges . Обратите внимание также, что при вызове AcceptChanges перед завершением редактирования с помощью EndEdit или CancelEdit изменение завершается, а для версий текущей и исходной строк принимаются предлагаемые значения строк. Таким же образом вызов RejectChanges завершает изменение и дис карта версий текущейи предлагаемой строки. Вызов EndEdit или CancelEdit после вызова AcceptChanges или RejectChanges не действует, так как изменение уже завершено.

В следующем примере показано, как использовать BeginEdit с EndEdit и CancelEdit. В примере также проверка предлагаемое значение в событии 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();  
    }  
}  

См. также