Modification de données dans une table

Lorsque vous modifiez les valeurs de colonnes d'un DataRow, les modifications sont immédiatement placées dans l'état Current de la ligne. Le RowState prend ensuite la valeur Modified, et les modifications sont acceptées ou rejetées à l'aide des méthodes AcceptChanges ou RejectChanges du DataRow. Le DataRow vous offre également trois méthodes pour suspendre l'état de la ligne pendant sa modification. Ces méthodes sont BeginEdit, EndEdit et CancelEdit.

Lorsque vous modifiez directement les valeurs de colonnes dans un DataRow, celui-ci les gère à l'aide des versions de ligne Current, Default et Original. En plus de ces trois versions de ligne, les méthodes BeginEdit, EndEdit et CancelEdit en utilisent une quatrième : Proposed. Pour plus d'informations sur les versions de ligne, consultez États et versions de ligne.

La version de ligne Proposed existe au cours d'une opération de modification commencée en appelant BeginEdit et terminée en utilisant EndEdit ou CancelEdit ou en appelant AcceptChanges ou RejectChanges.

Pendant l'opération de modification, vous pouvez appliquer la logique de validation à des colonnes individuelles en évaluant le ProposedValue dans l'événement ColumnChanged du DataTable. L'événement ColumnChanged contient DataColumnChangeEventArgs qui conserve une référence à la colonne en cours de modification et ProposedValue. Après avoir évalué la valeur proposée, vous pouvez la modifier ou annuler la modification. Après la modification, la ligne quitte l'état Proposed.

Vous pouvez confirmer les modifications en appelant EndEdit ou les annuler en appelant CancelEdit. Notez que même si EndEdit confirme vos modifications, le DataSet ne les accepte que lorsque la méthode AcceptChanges est appelée. Notez également que si vous appelez AcceptChanges avant de terminer la modification à l'aide de EndEdit ou CancelEdit, la modification se termine et les valeurs de ligne Proposed sont acceptées dans les versions de ligne Current et Original. De même, l'appel à RejectChanges termine la modification et rejette les versions de ligne Current et Proposed. L'appel à EndEdit ou CancelEdit, après l'appel à AcceptChanges ou RejectChanges, n'a aucun effet car la modification est déjà terminée.

L'exemple suivant montre comment utiliser BeginEdit avec EndEdit et CancelEdit. Cet exemple vérifie également le ProposedValue dans l'événement ColumnChanged et décide si la modification doit être annulée.

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

Voir aussi

Manipulation de données dans un DataTable | Utilisation d'événements DataTable | DataRow, classe | DataTable, classe | DataRowVersion, énumération