Condividi tramite


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

Vedi anche