Partager via


Modifications de DataTable

Lorsque vous apportez des modifications aux valeurs de colonne dans un DataRow, les modifications sont immédiatement placées dans l’état actuel de la ligne. La DataRowState valeur est ensuite définie sur modifiée, et les modifications sont acceptées ou rejetées en utilisant les méthodes AcceptChanges ou RejectChanges de DataRow. Il DataRow fournit également trois méthodes que vous pouvez utiliser pour suspendre l’état de la ligne pendant que vous la modifiez. Ces méthodes sont BeginEdit, EndEditet CancelEdit.

Lorsque vous modifiez directement les valeurs de colonne de DataRow, le DataRow gère ces valeurs en utilisant les versions de ligne actuelles, par défaut et Original. En plus de ces versions de ligne, beginEdit, EndEdit et CancelEdit les méthodes utilisent une quatrième version de ligne : Proposée. Pour plus d’informations sur les versions de lignes, consultez Les états des lignes et les versions de ligne.

La Proposed version de ligne existe pendant une opération de modification qui commence par appeler BeginEdit et qui se termine par l’utilisation EndEdit ou CancelEdit, ou par l’appel AcceptChanges ou RejectChanges.

Pendant l'opération de modification, vous pouvez appliquer la logique de validation à des colonnes individuelles en évaluant le ProposedValue lors de l'événement ColumnChanged du DataTable. L’événement ColumnChanged contient DataColumnChangeEventArgs une référence à la colonne qui change et à l’objet ProposedValue. Après avoir évalué la valeur proposée, vous pouvez la modifier ou annuler la modification. Lorsque la modification est terminée, la ligne se déplace hors de l’état Proposed .

Vous pouvez confirmer les modifications en appelant EndEdit, ou vous pouvez les annuler en appelant CancelEdit. Notez que, bien que EndEdit confirme vos modifications, DataSet ne les accepte pas réellement tant que AcceptChanges n'est pas appelé. Notez également que si vous appelez AcceptChanges avant d'avoir terminé la modification avec EndEdit ou CancelEdit, la modification est terminée et les valeurs de ligne Proposed sont acceptées pour les versions de ligne Current et Original. De la même façon, l'appel de RejectChanges met fin à la modification et annule les versions de ligne Current et Proposed. Appeler EndEdit ou CancelEdit après avoir appelé AcceptChanges ou RejectChanges n’a aucun effet, car la modification a déjà pris fin.

L’exemple suivant montre comment utiliser BeginEdit avec EndEdit et CancelEdit. L’exemple vérifie également le ProposedValue dans l'événement ColumnChanged et détermine s’il faut annuler la modification.

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

Voir aussi