Edições de DataTable
Quando você altera os valores de coluna em uma DataRow, as alterações são colocadas imediatamente no estado atual da linha. O DataRowState é definido como Modified, e as alterações são aceitas ou rejeitadas através dos métodos AcceptChanges ou RejectChanges da DataRow. A DataRow também fornece três métodos que você pode usar para suspender o estado da linha enquanto as edita. Esses métodos são BeginEdit, EndEdit e CancelEdit.
Quando você modifica valores de coluna em uma DataRowdiretamente, a DataRow gerencia os valores de coluna usando as versões de linha Current, Default e Original. Além dessas versões de linha, os métodos BeginEdit, EndEdit e CancelEdit usam 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 versão de 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 a lógica de validação às colunas individuais avaliando ProposedValue no evento ColumnChanged da DataTable. O evento ColumnChanged retém DataColumnChangeEventArgs que mantém uma referência à coluna que está alterando e o ProposedValue. Depois que você avaliar o valor proposto, poderá modificá-lo ou cancelar a edição. Quando a edição for finalizada, a linha será retirada do estado Proposed.
Você pode confirmar as edições chamando EndEdit ou você pode cancelá-las chamando CancelEdit. Observe que, embora EndEdit confirme suas edições, DataSet só aceitará realmente as alterações quando AcceptChanges for chamado. Observe também que, se você chamar AcceptChanges antes de encerrar 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 Current e Original. Da mesma forma, chamar RejectChanges terminará a edição e descartará as versões de linha Current e Proposed. Chamar EndEdit ou CancelEdit após chamar AcceptChanges ou RejectChanges não terá efeito porque a edição já foi encerrada.
O exemplo a seguir demonstra como usar BeginEdit com EndEdit e CancelEdit. O exemplo também verifica ProposedValue no evento ColumnChanged e decide se a edição será cancelada.
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();
}
}