Partilhar via


Edições do 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. DataRow também fornece os três métodos que pode usar para suspender o estado da linha enquanto a está a editar. Esses métodos são BeginEdit, EndEdite CancelEdit.

Quando modifica os valores das colunas diretamente DataRow, DataRow gere os valores das colunas usando as versões de linha Current, Default e Original. Para além destas versões de linha, os métodos BeginEdit, EndEdit e CancelEdit utilizam uma quarta versão de linha: Proposed. Para obter mais informações sobre versões de linha, consulte Estados de linha e versões de linha.

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

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

Você pode confirmar edições chamando EndEdit ou cancelá-las chamando CancelEdit. Note que, embora o EndEdit confirme as suas edições, o DataSet não aceita realmente as alterações até que o AcceptChanges seja chamado. Note também que, se chamar AcceptChanges antes de terminar a edição com EndEdit ou CancelEdit, a edição é terminada e os valores da linha Proposed são aceites tanto para as versões de linha Current como Original. Da mesma forma, chamar RejectChanges termina a edição e descarta as versões de linha Current e Proposed. Chamar EndEdit ou CancelEdit depois de chamar AcceptChanges ou RejectChanges não tem efeito porque a edição já terminou.

O exemplo seguinte demonstra como usar BeginEdit com EndEdit e CancelEdit. O exemplo também verifica o ProposedValue no ColumnChanged evento e decide se cancela 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();
    }
}

Ver também