Partilhar via


Edições DataTable

Quando você faz alterações nos valores de coluna em um DataRow, as alterações são imediatamente colocadas no estado atual da linha. O DataRowState é então definido como Modificado e as alterações são aceitas ou rejeitadas usando os AcceptChanges métodos ou RejectChanges do DataRow. O DataRow também fornece três métodos que você pode usar para suspender o estado da linha enquanto você está editando-a. Esses métodos são BeginEdit, EndEdite CancelEdit.

Quando você modifica valores de coluna em um DataRow diretamente, o DataRow gerencia os valores de coluna usando as versões de linha Atual, Padrão e Original . Além dessas versões de linha, os métodos BeginEdit, EndEdit e CancelEdit usam uma versão de quarta linha: Proposed. Para obter mais informações sobre versões de linha, consulte Estados de linha e versões de linha.

A versão da linha Proposed existe durante uma operação de edição que começa chamando BeginEdit e termina usando EndEdit ou CancelEdit, ou chamando AcceptChanges ou RejectChanges.

Durante a operação de edição, você pode aplicar lógica de validação a colunas individuais avaliando o ProposedValue no evento ColumnChanged da DataTable. O evento ColumnChanged contém DataColumnChangeEventArgs que mantêm uma referência à coluna que está mudando e ao ProposedValue. Depois de avaliar o valor proposto, você pode modificá-lo ou cancelar a edição. Quando a edição é encerrada, a linha sai do estado Proposto .

Você pode confirmar edições chamando EndEdit ou cancelá-las chamando CancelEdit. Observe que, embora EndEdit confirme suas edições, o DataSet não aceita as alterações até que AcceptChanges seja chamado. Observe também que, se você chamar AcceptChanges antes de terminar a edição com EndEdit ou CancelEdit, a edição será encerrada e os valores de linha Proposed serão aceitos para as versões de linha Atual e Original . Da mesma forma, chamar RejectChanges encerra a edição e descarta as versões de linha Atual e Proposta . Chamar EndEdit ou CancelEdit depois de chamar AcceptChanges ou RejectChanges não tem efeito porque a edição já terminou.

O exemplo a seguir demonstra como usar BeginEdit com EndEdit e CancelEdit. O exemplo também verifica o ProposedValue no evento ColumnChanged e decide se deseja cancelar a edição.

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();  
    }  
}  

Consulte também