Изменения таблицы данных

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

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

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

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

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

См. также