Modifiche agli oggetti DataTable
Quando si apportano modifiche ai valori di colonna in DataRow, le modifiche vengono inserite direttamente nello stato attuale della riga. DataRowState viene quindi impostato su Modified e le modifiche vengono accettate o rifiutate usando i metodi AcceptChanges o RejectChanges di DataRow. In DataRow sono inoltre disponibili tre metodi che consentono di sospendere lo stato di una riga durante la modifica. Questi metodi sono BeginEdit, EndEdit e CancelEdit.
Quando si modificano i valori delle colonne direttamente in DataRow, DataRow gestirà tali valori usando le versioni di riga Current, Default e Original. Oltre a tali versioni di riga, nei metodi BeginEdit, EndEdit e CancelEdit viene usata una quarta versione: Proposed. Per altre informazioni sulle versioni delle righe, vedere Stati e versioni delle righe.
La versione di riga Proposed risulta disponibile durante un'operazione di modifica iniziata chiamando BeginEdit e terminata tramite EndEdit o CancelEdit oppure tramite una chiamata ad AcceptChanges o RejectChanges.
Durante l'operazione di modifica è possibile applicare la logica di convalida a singole colonne valutando ProposedValue nell'evento ColumnChanged della DataTable. L'evento ColumnChanged contiene DataColumnChangeEventArgs, che consente di conservare un riferimento alla colonna in fase di modifica e a ProposedValue. Una volta terminata la valutazione del valore proposto, è possibile modificarlo o annullare la modifica. Al termine della modifica, la riga perde lo stato Proposed.
È possibile confermare le modifiche chiamando EndEdit o annullarle chiamando CancelEdit. Notare che mentre EndEdit consente di confermare le modifiche, DataSet non consente l'accettazione delle modifiche fino a quando non viene chiamato AcceptChanges. Notare inoltre che, se si chiama AcceptChanges prima del completamento della modifica tramite EndEdit o CancelEdit, l'operazione di modifica viene terminata e i valori di riga Proposed vengono accettati sia nella versione di riga Current che nella versione di riga Original. Analogamente, la chiamata a RejectChanges consente di terminare la modifica ed eliminare le versioni di riga Current e Proposed. Chiamando EndEdit o CancelEdit dopo aver chiamato AcceptChanges o RejectChanges non si otterrà alcun effetto, poiché l'operazione di modifica è già stata terminata.
Nell'esempio seguente viene mostrato come usare BeginEdit con EndEdit e CancelEdit. L'esempio consente inoltre di controllare il valore ProposedValue nell'evento ColumnChanged e di stabilire se annullare la modifica.
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();
}
}