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.
Autres événements liés
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é :
Créez l'enregistrement proposé et appliquez les modifications éventuelles.
Vérifiez les contraintes pour les colonnes autres que les colonnes d'expression.
Déclenchez les événements
RowChanging
ouRowDeleting
selon les besoins.Définissez l'enregistrement proposé comme enregistrement en cours.
Mettez à jour les index associés éventuels.
Déclenchez les événements
ListChanged
pour les objetsDataView
associés et les événementsPropertyChanged
pour les objetsDataRowView
associés.Évaluez toutes les colonnes d'expression, mais retardez la vérification des contraintes éventuelles sur ces colonnes.
Déclenchez les événements
ListChanged
pour les objetsDataView
associés et les événementsPropertyChanged
pour les objetsDataRowView
associés affectés par les évaluations des colonnes d'expression.Déclenchez les événements
RowChanged
ouRowDeleted
selon les besoins.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