Обработка событий DataTable
Объект DataTable предоставляет ряд событий, которые могут обрабатываться приложением. В следующей таблице описаны события DataTable
.
Событие | Описание |
---|---|
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 = [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={e.Row["name"]}; action={e.Action}");
static void Row_Changing(object sender, DataRowChangeEventArgs e) =>
Console.WriteLine($"Row_Changing Event: name={e.Row["name"]}; action={e.Action}");
static void Row_Deleted(object sender, DataRowChangeEventArgs e) =>
Console.WriteLine($"Row_Deleted Event: name={e.Row["name", DataRowVersion.Original]}; action={e.Action}");
static void Row_Deleting(object sender,
DataRowChangeEventArgs e) =>
Console.WriteLine($"Row_Deleting Event: name={e.Row["name"]}; action={e.Action}");
static void Column_Changed(object sender, DataColumnChangeEventArgs e) =>
Console.WriteLine($"Column_Changed Event: ColumnName={e.Column.ColumnName}; RowState={e.Row.RowState}");
static void Column_Changing(object sender, DataColumnChangeEventArgs e) =>
Console.WriteLine($"Column_Changing Event: ColumnName={e.Column.ColumnName}; RowState={e.Row.RowState}");
static void Table_NewRow(object sender,
DataTableNewRowEventArgs e) =>
Console.WriteLine($"Table_NewRow Event: RowState={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