Поделиться через


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

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

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

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

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

См. также