Обработка событий таблиц данных
Объект DataTable предоставляет ряд событий, которые может обрабатывать приложение. В следующей таблице приводится описание событий DataTable
.
Мероприятие | Description |
---|---|
Initialized | Происходит после вызова метода EndInit объекта DataTable . Главным образом это событие предназначено для поддержки сценариев во время разработки. |
ColumnChanged | Происходит после успешного изменения значения в объекте DataColumn. |
ColumnChanging | Происходит при подаче значения для объекта DataColumn . |
RowChanged | Происходит после успешного изменения значения DataColumn или состояния RowState объекта DataRow в объекте DataTable . |
RowChanging | Происходит при подаче изменения для значения DataColumn или состояния RowState объекта DataRow в объекте DataTable . |
RowDeleted | Происходит после того, как объект DataRow в объекте DataTable был отмечен, как Deleted . |
RowDeleting | Происходит перед тем, как объект DataRow в объекте DataTable будет отмечен как Deleted . |
TableCleared | Происходит после того, как вызов метода Clear объекта DataTable успешно очистил каждый объект DataRow . |
TableClearing | Происходит после вызова метода Clear , но до начала операции Clear . |
TableNewRow | Происходит после создания нового объекта DataRow путем вызова метода NewRow объекта DataTable . |
Disposed | Происходит, когда объект DataTable удаляется Disposed . Наследуется от MarshalByValueComponent. |
Примечание.
Большинство операций, которые добавляют или удаляют строки, не вызывают событий ColumnChanged
и ColumnChanging
. Однако метод ReadXml
вызывает события ColumnChanged
и ColumnChanging
, если только свойству XmlReadMode
не задано значение DiffGram
или значение Auto
, когда читаемый XML-документ является DiffGram
.
Предупреждение
Изменение данных в объекте DataSet
, из которого было вызвано событие RowChanged
, может привести к повреждению данных. При подобном повреждении данных исключение вызвано не будет.
Дополнительные связанные события
Свойство Constraints содержит экземпляр ConstraintCollection. Класс ConstraintCollection представляет событие CollectionChanged. Это событие возникает при добавлении, изменении или удалении ограничения из коллекции ConstraintCollection
.
Свойство Columns содержит экземпляр DataColumnCollection. Класс DataColumnCollection
представляет событие CollectionChanged. Это событие возникает при добавлении, изменении или удалении из коллекции DataColumn
объекта DataColumnCollection
. Среди изменений, которые могут вызвать возникновение этого события, - изменения имени, типа, выражения или порядкового номера столбца.
Свойство Tables объекта DataSet содержит экземпляр DataTableCollection. Класс DataTableCollection
вызывает события CollectionChanged
и CollectionChanging
. Эти события возникают при добавлении или удалении из коллекции DataTable
объекта DataSet
.
Внесение изменений в объекты DataRows
также могут вызвать события для ассоциированного объекта DataView. Класс DataView
вызывает событие ListChanged, которое возникает при изменении значения DataColumn
или при изменении композиции или порядка сортировки представления. Класс DataRowView вызывает событие PropertyChanged, которое возникает при изменении значения ассоциированного объекта DataColumn
.
Последовательность операций
При добавлении, изменении или удалении объекта DataRow
надо выполнить следующую последовательность операций.
Создайте предложенную запись и внесите любые изменения.
Проверьте ограничения для столбцов, не входящих в выражения.
Вызовите событие
RowChanging
илиRowDeleting
, в зависимости от ситуации.Сделайте предложенную запись текущей.
Обновите все ассоциированные индексы.
Вызовите события
ListChanged
для ассоциированных объектовDataView
, а также событияPropertyChanged
для ассоциированных объектовDataRowView
.Оцените все столбцы выражения, но отложите проверку любых ограничений для этих столбцов.
Вызовите события
ListChanged
для ассоциированных объектовDataView
, а также событияPropertyChanged
для ассоциированных объектовDataRowView
, затронутых оценками столбцов выражения.Вызовите событие
RowChanged
илиRowDeleted
, в зависимости от ситуации.Проверьте ограничения на столбцы выражения.
Примечание.
Внесение изменений в столбцы выражений никогда не вызывает события DataTable
. Внесение изменений в столбцы выражений вызывает только события DataView
и DataRowView
. Столбцы выражения могут иметь зависимости от нескольких других столбцов, их оценка во время одной операции DataRow
может производиться несколько раз. События вызываются при вычислении каждого выражения, а при работе со столбцами выражений одна операция DataRow
может вызвать несколько событий ListChanged
и PropertyChanged
, возможно, с несколькими событиями для одного столбца выражений.
Предупреждение
Не вызывайте исключение NullReferenceException в обработчике события RowChanged
. Если исключение NullReferenceException вызывается в пределах события RowChanged
объекта DataTable
, объект DataTable
будет поврежден.
Пример
В следующем примере демонстрируется, как создавать обработчики событий для событий RowChanged
, RowChanging
, RowDeleted
, RowDeleting
, ColumnChanged
, ColumnChanging
, TableNewRow
, TableCleared
и TableClearing
. Каждый обработчик события при возникновении события отображает выводимые данные в консольном окне.
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