Modifica dei dati nella tabella

Quando si apportano modifiche ai valori di colonna in DataRow, le modifiche vengono inserite direttamente nello stato Current della riga. Il valore per RowState viene quindi impostato su Modified e le modifiche vengono accettate o rifiutate tramite 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. Tali metodi sono BeginEdit, EndEdit e CancelEdit.

Quando si modificano i valori delle colonne direttamente in un DataRow, il DataRow gestirà tali valori utilizzando le versioni di riga Current, Default e Original. Oltre a tali versioni di riga, nei metodi BeginEdit, EndEdit e CancelEdit viene utilizzata una quarta versione: Proposed. Per ulteriori informazioni sulle versioni delle righe, vedere Stati delle righe e versioni delle righe.

La versione di riga Proposed risulta disponibile durante un'operazione di modifica iniziata da un BeginEdit chiamante 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. Nell'evento ColumnChanged è contenuto 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. Si noti che mentre EndEdit consente di confermare le modifiche, DataSet non consente l'accettazione delle modifiche fino a quando non viene chiamato AcceptChanges. Si noti 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 di 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 utilizzare 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
[C#]
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();
    }
}

Vedere anche

Modifica dei dati in una DataTable | Utilizzo degli eventi della DataTable | Classe DataRow | Classe DataTable | Enumerazione DataRowVersion