Gestion des événements de DataTable

L'objet DataTable fournit une série d'événements pouvant être traités par une application. Le tableau ci-dessous décrit les événements DataTable.

Événement Description
Initialized Se produit après que la méthode EndInit d'un DataTable a été appelée. Cet événement est destiné principalement à prendre en charge les scénarios au moment du design.
ColumnChanged Se produit après qu'une valeur a été modifiée avec succès dans un DataColumn.
ColumnChanging Se produit quand une valeur a été proposée pour un DataColumn.
RowChanged Se produit après qu'une valeur DataColumn ou le RowState d'un DataRow ont été modifiés avec succès dans le DataTable.
RowChanging Se produit quand une modification a été proposée pour une valeur DataColumn ou le RowState d'un DataRow dans le DataTable.
RowDeleted Se produit après qu'un DataRow dans le DataTable a été marqué comme Deleted.
RowDeleting Se produit avant qu'un DataRow dans le DataTable soit marqué comme Deleted.
TableCleared Se produit après qu'un appel à la méthode Clear du DataTable a effacé avec succès chaque DataRow.
TableClearing Se produit après que la méthode Clear a été appelée mais avant que l'opération Clear commence.
TableNewRow Se produit après la création d'un nouveau DataRow par un appel à la méthode NewRow du DataTable.
Disposed Se produit lorsque le DataTable a la valeur Disposed. Hérité de MarshalByValueComponent.

Notes

La plupart des opérations qui ajoutent ou suppriment des lignes ne déclenchent pas les événements ColumnChanged et ColumnChanging. Toutefois, la méthode ReadXml déclenche les événements ColumnChanged et ColumnChanging, à moins que XmlReadMode ait la valeur DiffGram ou Auto lorsque le document XML lu est un DiffGram.

Avertissement

Les données peuvent être endommagées si elles sont modifiées dans un DataSet à partir duquel l'événement RowChanged est déclenché. Aucune exception n'est levée en cas d'endommagement de ce type.

La propriété Constraints détient une instance ConstraintCollection. La classe ConstraintCollection expose un événement CollectionChanged. Cet événement se déclenche lorsqu'une contrainte est ajoutée, modifiée ou supprimée dans ConstraintCollection.

La propriété Columns détient une instance DataColumnCollection. La classe DataColumnCollection expose un événement CollectionChanged. Cet événement se déclenche lorsqu'un DataColumn est ajouté, modifié ou supprimé dans DataColumnCollection. Les modifications à l'origine du déclenchement de l'événement incluent des modifications du nom, du type, de l'expression ou de la position ordinale d'une colonne.

La propriété Tables d'un DataSet détient une instance DataTableCollection. La classe DataTableCollection expose un événement CollectionChanged et un événement CollectionChanging. Ces événements se déclenchent lorsqu'un DataTable est ajouté ou supprimé dans le DataSet.

Les modifications apportées aux DataRows peuvent également déclencher des événements pour un DataView associé. La classe DataView expose un événement ListChanged qui se déclenche lorsqu'une valeur DataColumn change ou lorsque la composition ou l'ordre de tri de la vue changent. La classe DataRowView expose un événement PropertyChanged qui se déclenche lorsqu'une valeur DataColumn associée change.

Ordre des opérations

Voici l'ordre des opérations qui se produisent lorsqu'un DataRow est ajouté, modifié ou supprimé :

  1. Créez l'enregistrement proposé et appliquez les modifications éventuelles.

  2. Vérifiez les contraintes pour les colonnes autres que les colonnes d'expression.

  3. Déclenchez les événements RowChanging ou RowDeleting selon les besoins.

  4. Définissez l'enregistrement proposé comme enregistrement en cours.

  5. Mettez à jour les index associés éventuels.

  6. Déclenchez les événements ListChanged pour les objets DataView associés et les événements PropertyChanged pour les objets DataRowView associés.

  7. Évaluez toutes les colonnes d'expression, mais retardez la vérification des contraintes éventuelles sur ces colonnes.

  8. Déclenchez les événements ListChanged pour les objets DataView associés et les événements PropertyChanged pour les objets DataRowView associés affectés par les évaluations des colonnes d'expression.

  9. Déclenchez les événements RowChanged ou RowDeleted selon les besoins.

  10. Vérifiez les contraintes sur les colonnes d'expression.

Notes

Des modifications apportées aux colonnes d'expression ne déclenchent jamais des événements DataTable. Des modifications apportées aux colonnes d'expression déclenchent uniquement des événements DataView et DataRowView. Les colonnes d'expression peuvent avoir des dépendances sur plusieurs autres colonnes et peuvent être évaluées plusieurs fois au cours d'une même opération DataRow. Chaque évaluation d'expression déclenche des événements et une opération DataRow individuelle peut déclencher plusieurs événements ListChanged et PropertyChanged lorsque des colonnes d'expression sont affectées, dont éventuellement plusieurs événements pour une même colonne d'expression.

Avertissement

Ne levez pas de NullReferenceException à l'intérieur du gestionnaire d'événements RowChanged. Si une NullReferenceException est levée à l'intérieur de l'événement RowChanged d'une DataTable, DataTable sera corrompue.

Exemple

L'exemple ci-dessous montre comment créer des gestionnaires d'événements pour les événements RowChanged, RowChanging, RowDeleted, RowDeleting, ColumnChanged, ColumnChanging, TableNewRow, TableCleared et TableClearing. Chaque gestionnaire d'événements affiche la sortie dans la fenêtre de console lorsqu'il est déclenché.

static void DataTableEvents()
{
    DataTable table = new("Customers");
    // Add two columns, id and name.
    table.Columns.Add("id", typeof(int));
    table.Columns.Add("name", typeof(string));

    // Set the primary key.
    table.Columns["id"].Unique = true;
    table.PrimaryKey = new DataColumn[] { table.Columns["id"] };

    // Add a RowChanged event handler.
    table.RowChanged += Row_Changed;

    // Add a RowChanging event handler.
    table.RowChanging += Row_Changing;

    // Add a RowDeleted event handler.
    table.RowDeleted += Row_Deleted;

    // Add a RowDeleting event handler.
    table.RowDeleting += Row_Deleting;

    // Add a ColumnChanged event handler.
    table.ColumnChanged +=
        Column_Changed;

    // Add a ColumnChanging event handler.
    table.ColumnChanging +=
        Column_Changing;

    // Add a TableNewRow event handler.
    table.TableNewRow +=
        Table_NewRow;

    // Add a TableCleared event handler.
    table.TableCleared +=
        Table_Cleared;

    // Add a TableClearing event handler.
    table.TableClearing +=
        Table_Clearing;

    // Add a customer.
    DataRow row = table.NewRow();
    row["id"] = 1;
    row["name"] = "Customer1";
    table.Rows.Add(row);

    table.AcceptChanges();

    // Change the customer name.
    table.Rows[0]["name"] = "ChangedCustomer1";

    // Delete the row.
    table.Rows[0].Delete();

    // Clear the table.
    table.Clear();
}

static void Row_Changed(object sender, DataRowChangeEventArgs e) =>
    Console.WriteLine("Row_Changed Event: name={0}; action={1}",
        e.Row["name"], e.Action);

static void Row_Changing(object sender, DataRowChangeEventArgs e) =>
    Console.WriteLine("Row_Changing Event: name={0}; action={1}",
        e.Row["name"], e.Action);

static void Row_Deleted(object sender, DataRowChangeEventArgs e) =>
    Console.WriteLine("Row_Deleted Event: name={0}; action={1}",
        e.Row["name", DataRowVersion.Original], e.Action);

static void Row_Deleting(object sender,
DataRowChangeEventArgs e) =>
    Console.WriteLine("Row_Deleting Event: name={0}; action={1}",
        e.Row["name"], e.Action);

static void Column_Changed(object sender, DataColumnChangeEventArgs e) =>
    Console.WriteLine("Column_Changed Event: ColumnName={0}; RowState={1}",
        e.Column.ColumnName, e.Row.RowState);

static void Column_Changing(object sender, DataColumnChangeEventArgs e) =>
    Console.WriteLine("Column_Changing Event: ColumnName={0}; RowState={1}",
        e.Column.ColumnName, e.Row.RowState);

static void Table_NewRow(object sender,
    DataTableNewRowEventArgs e) =>
    Console.WriteLine("Table_NewRow Event: RowState={0}",
        e.Row.RowState.ToString());

static void Table_Cleared(object sender, DataTableClearEventArgs e) =>
    Console.WriteLine("Table_Cleared Event: TableName={0}; Rows={1}",
        e.TableName, e.Table.Rows.Count.ToString());

static void Table_Clearing(object sender, DataTableClearEventArgs e) =>
    Console.WriteLine("Table_Clearing Event: TableName={0}; Rows={1}",
        e.TableName, e.Table.Rows.Count.ToString());
Private Sub DataTableEvents()

    Dim table As New DataTable("Customers")
    ' Add two columns, id and name.
    table.Columns.Add("id", Type.GetType("System.Int32"))
    table.Columns.Add("name", Type.GetType("System.String"))

    ' Set the primary key.
    table.Columns("id").Unique = True
    table.PrimaryKey = New DataColumn() {table.Columns("id")}

    ' Add a RowChanged event handler.
    AddHandler table.RowChanged, _
           New DataRowChangeEventHandler(AddressOf Row_Changed)

    ' Add a RowChanging event handler.
    AddHandler table.RowChanging, _
           New DataRowChangeEventHandler(AddressOf Row_Changing)

    ' Add a RowDeleted event handler.
    AddHandler table.RowDeleted, New _
           DataRowChangeEventHandler(AddressOf Row_Deleted)

    ' Add a RowDeleting event handler.
    AddHandler table.RowDeleting, New _
           DataRowChangeEventHandler(AddressOf Row_Deleting)

    ' Add a ColumnChanged event handler.
    AddHandler table.ColumnChanged, _
           New DataColumnChangeEventHandler(AddressOf Column_Changed)

    ' Add a ColumnChanging event handler for the table.
    AddHandler table.ColumnChanging, New _
           DataColumnChangeEventHandler(AddressOf Column_Changing)

    ' Add a TableNewRow event handler.
    AddHandler table.TableNewRow, New _
           DataTableNewRowEventHandler(AddressOf Table_NewRow)

    ' Add a TableCleared event handler.
    AddHandler table.TableCleared, New _
           DataTableClearEventHandler(AddressOf Table_Cleared)

    ' Add a TableClearing event handler.
    AddHandler table.TableClearing, New _
           DataTableClearEventHandler(AddressOf Table_Clearing)

    ' Add a customer.
    Dim row As DataRow = table.NewRow()
    row("id") = 1
    row("name") = "Customer1"
    table.Rows.Add(row)

    table.AcceptChanges()

    ' Change the customer name.
    table.Rows(0).Item("name") = "ChangedCustomer1"

    ' Delete the row.
    table.Rows(0).Delete()

    ' Clear the table.
    table.Clear()
End Sub


Private Sub Row_Changed(ByVal sender As Object, _
    ByVal e As DataRowChangeEventArgs)
    Console.WriteLine("Row_Changed Event: name={0}; action={1}", _
     e.Row("name"), e.Action)
End Sub

Private Sub Row_Changing(ByVal sender As Object, _
    ByVal e As DataRowChangeEventArgs)
    Console.WriteLine("Row_Changing Event: name={0}; action={1}", _
     e.Row("name"), e.Action)
End Sub

Private Sub Row_Deleted(ByVal sender As Object, _
    ByVal e As DataRowChangeEventArgs)
    Console.WriteLine("Row_Deleted Event: name={0}; action={1}", _
     e.Row("name", DataRowVersion.Original), e.Action)
End Sub

Private Sub Row_Deleting(ByVal sender As Object, _
    ByVal e As DataRowChangeEventArgs)
    Console.WriteLine("Row_Deleting Event: name={0}; action={1}", _
       e.Row("name"), e.Action)
End Sub

Private Sub Column_Changed(ByVal sender As Object, _
    ByVal e As DataColumnChangeEventArgs)
    Console.WriteLine("Column_Changed Event: ColumnName={0}; RowState={1}", _
       e.Column.ColumnName, e.Row.RowState)
End Sub

Private Sub Column_Changing(ByVal sender As Object, _
    ByVal e As DataColumnChangeEventArgs)
    Console.WriteLine("Column_Changing Event: ColumnName={0}; RowState={1}", _
       e.Column.ColumnName, e.Row.RowState)
End Sub

Private Sub Table_NewRow(ByVal sender As Object, _
ByVal e As DataTableNewRowEventArgs)
    Console.WriteLine("Table_NewRow Event: RowState={0}", _
       e.Row.RowState.ToString())
End Sub

Private Sub Table_Cleared(ByVal sender As Object, _
    ByVal e As DataTableClearEventArgs)
    Console.WriteLine("Table_Cleared Event: TableName={0}; Rows={1}", _
       e.TableName, e.Table.Rows.Count.ToString())
End Sub

Private Sub Table_Clearing(ByVal sender As Object, _
    ByVal e As DataTableClearEventArgs)
    Console.WriteLine("Table_Clearing Event: TableName={0}; Rows={1}", _
       e.TableName, e.Table.Rows.Count.ToString())
End Sub

Voir aussi