Обработка событий таблиц данныхHandling DataTable Events
Объект DataTable предоставляет ряд событий, которые может обрабатывать приложение.The DataTable object provides a series of events that can be processed by an application. В следующей таблице приводится описание событий DataTable
.The following table describes DataTable
events.
СобытиеEvent | ОписаниеDescription |
---|---|
Initialized | Происходит после вызова метода EndInit объекта DataTable .Occurs after the EndInit method of a DataTable is called. Главным образом это событие предназначено для поддержки сценариев во время разработки.This event is intended primarily to support design-time scenarios. |
ColumnChanged | Происходит после успешного изменения значения в объекте DataColumn.Occurs after a value has been successfully changed in a DataColumn. |
ColumnChanging | Происходит при подаче значения для объекта DataColumn .Occurs when a value has been submitted for a DataColumn . |
RowChanged | Происходит после успешного изменения значения DataColumn или состояния RowState объекта DataRow в объекте DataTable .Occurs after a DataColumn value or the RowState of a DataRow in the DataTable has been changed successfully. |
RowChanging | Происходит при подаче изменения для значения DataColumn или состояния RowState объекта DataRow в объекте DataTable .Occurs when a change has been submitted for a DataColumn value or the RowState of a DataRow in the DataTable . |
RowDeleted | Происходит после того, как объект DataRow в объекте DataTable был отмечен, как Deleted .Occurs after a DataRow in the DataTable has been marked as Deleted . |
RowDeleting | Происходит перед тем, как объект DataRow в объекте DataTable будет отмечен как Deleted .Occurs before a DataRow in the DataTable is marked as Deleted . |
TableCleared | Происходит после того, как вызов метода Clear объекта DataTable успешно очистил каждый объект DataRow .Occurs after a call to the Clear method of the DataTable has successfully cleared every DataRow . |
TableClearing | Происходит после вызова метода Clear , но до начала операции Clear .Occurs after the Clear method is called but before the Clear operation begins. |
TableNewRow | Происходит после создания нового объекта DataRow путем вызова метода NewRow объекта DataTable .Occurs after a new DataRow is created by a call to the NewRow method of the DataTable . |
Disposed | Происходит, когда объект DataTable удаляется Disposed .Occurs when the DataTable is Disposed . Наследуется от MarshalByValueComponent.Inherited from MarshalByValueComponent. |
Примечание
Большинство операций, которые добавляют или удаляют строки, не вызывают событий ColumnChanged
и ColumnChanging
.Most operations that add or delete rows do not raise the ColumnChanged
and ColumnChanging
events. Однако метод ReadXml
вызывает события ColumnChanged
и ColumnChanging
, если только свойству XmlReadMode
не задано значение DiffGram
или значение Auto
, когда читаемый XML-документ является DiffGram
.However, the ReadXml
method does raise ColumnChanged
and ColumnChanging
events, unless the XmlReadMode
is set to DiffGram
or is set to Auto
when the XML document being read is a DiffGram
.
Предупреждение
Изменение данных в объекте DataSet
, из которого было вызвано событие RowChanged
, может привести к повреждению данных.Data corruption can occur if data is modified in a DataSet
from which the RowChanged
event is raised. При подобном повреждении данных исключение вызвано не будет.No exception will be raised if such data corruption occurs.
Дополнительные связанные событияAdditional Related Events
Свойство Constraints содержит экземпляр ConstraintCollection.The Constraints property holds a ConstraintCollection instance. Класс ConstraintCollection представляет событие CollectionChanged.The ConstraintCollection class exposes a CollectionChanged event. Это событие возникает при добавлении, изменении или удалении ограничения из коллекции ConstraintCollection
.This event fires when a constraint is added, modified, or removed from the ConstraintCollection
.
Свойство Columns содержит экземпляр DataColumnCollection.The Columns property holds a DataColumnCollection instance. Класс DataColumnCollection
представляет событие CollectionChanged.The DataColumnCollection
class exposes a CollectionChanged event. Это событие возникает при добавлении, изменении или удалении из коллекции DataColumn
объекта DataColumnCollection
.This event fires when a DataColumn
is added, modified, or removed from the DataColumnCollection
. Среди изменений, которые могут вызвать возникновение этого события, - изменения имени, типа, выражения или порядкового номера столбца.Modifications that cause the event to fire include changes to the name, type, expression or ordinal position of a column.
Свойство Tables объекта DataSet содержит экземпляр DataTableCollection.The Tables property of a DataSet holds a DataTableCollection instance. Класс DataTableCollection
вызывает события CollectionChanged
и CollectionChanging
.The DataTableCollection
class exposes both a CollectionChanged
and a CollectionChanging
event. Эти события возникают при добавлении или удалении из коллекции DataTable
объекта DataSet
.These events fire when a DataTable
is added to or removed from the DataSet
.
Внесение изменений в объекты DataRows
также могут вызвать события для ассоциированного объекта DataView.Changes to DataRows
can also trigger events for an associated DataView. Класс DataView
вызывает событие ListChanged, которое возникает при изменении значения DataColumn
или при изменении композиции или порядка сортировки представления.The DataView
class exposes a ListChanged event that fires when a DataColumn
value changes or when the composition or sort order of the view changes. Класс DataRowView вызывает событие PropertyChanged, которое возникает при изменении значения ассоциированного объекта DataColumn
.The DataRowView class exposes a PropertyChanged event that fires when an associated DataColumn
value changes.
Последовательность операцийSequence of Operations
При добавлении, изменении или удалении объекта DataRow
надо выполнить следующую последовательность операций.Here is the sequence of operations that occur when a DataRow
is added, modified, or deleted:
Создайте предложенную запись и внесите любые изменения.Create the proposed record and apply any changes.
Проверьте ограничения для столбцов, не входящих в выражения.Check constraints for non-expression columns.
Вызовите событие
RowChanging
илиRowDeleting
, в зависимости от ситуации.Raise theRowChanging
orRowDeleting
events as applicable.Сделайте предложенную запись текущей.Set the proposed record to be the current record.
Обновите все ассоциированные индексы.Update any associated indexes.
Вызовите события
ListChanged
для ассоциированных объектовDataView
, а также событияPropertyChanged
для ассоциированных объектовDataRowView
.RaiseListChanged
events for associatedDataView
objects andPropertyChanged
events for associatedDataRowView
objects.Оцените все столбцы выражения, но отложите проверку любых ограничений для этих столбцов.Evaluate all expression columns, but delay checking any constraints on these columns.
Вызовите события
ListChanged
для ассоциированных объектовDataView
, а также событияPropertyChanged
для ассоциированных объектовDataRowView
, затронутых оценками столбцов выражения.RaiseListChanged
events for associatedDataView
objects andPropertyChanged
events for associatedDataRowView
objects affected by the expression column evaluations.Вызовите событие
RowChanged
илиRowDeleted
, в зависимости от ситуации.RaiseRowChanged
orRowDeleted
events as applicable.Проверьте ограничения на столбцы выражения.Check constraints on expression columns.
Примечание
Внесение изменений в столбцы выражений никогда не вызывает события DataTable
.Changes to expression columns never raise DataTable
events. Внесение изменений в столбцы выражений вызывает только события DataView
и DataRowView
.Changes to expression columns only raise DataView
and DataRowView
events. Столбцы выражения могут иметь зависимости от нескольких других столбцов, их оценка во время одной операции DataRow
может производиться несколько раз.Expression columns can have dependencies on multiple other columns, and can be evaluated multiple times during a single DataRow
operation. События вызываются при вычислении каждого выражения, а при работе со столбцами выражений одна операция DataRow
может вызвать несколько событий ListChanged
и PropertyChanged
, возможно, с несколькими событиями для одного столбца выражений.Each expression evaluation raises events, and a single DataRow
operation can raise multiple ListChanged
and PropertyChanged
events when expression columns are affected, possibly including multiple events for the same expression column.
Предупреждение
Не вызывайте исключение NullReferenceException в обработчике события RowChanged
.Do not throw a NullReferenceException within the RowChanged
event handler. Если исключение NullReferenceException вызывается в пределах события RowChanged
объекта DataTable
, объект DataTable
будет поврежден.If a NullReferenceException is thrown within the RowChanged
event of a DataTable
, then the DataTable
will be corrupted.
ПримерExample
В следующем примере демонстрируется, как создавать обработчики событий для событий RowChanged
, RowChanging
, RowDeleted
, RowDeleting
, ColumnChanged
, ColumnChanging
, TableNewRow
, TableCleared
и TableClearing
.The following example demonstrates how to create event handlers for the RowChanged
, RowChanging
, RowDeleted
, RowDeleting
, ColumnChanged
, ColumnChanging
, TableNewRow
, TableCleared
, and TableClearing
events. Каждый обработчик события при возникновении события отображает выводимые данные в консольном окне.Each event handler displays output in the console window when it is fired.
static void DataTableEvents()
{
DataTable table = new DataTable("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 += new DataRowChangeEventHandler(Row_Changed);
// Add a RowChanging event handler.
table.RowChanging += new DataRowChangeEventHandler(Row_Changing);
// Add a RowDeleted event handler.
table.RowDeleted += new DataRowChangeEventHandler(Row_Deleted);
// Add a RowDeleting event handler.
table.RowDeleting += new DataRowChangeEventHandler(Row_Deleting);
// Add a ColumnChanged event handler.
table.ColumnChanged += new
DataColumnChangeEventHandler(Column_Changed);
// Add a ColumnChanging event handler.
table.ColumnChanging += new
DataColumnChangeEventHandler(Column_Changing);
// Add a TableNewRow event handler.
table.TableNewRow += new
DataTableNewRowEventHandler(Table_NewRow);
// Add a TableCleared event handler.
table.TableCleared += new
DataTableClearEventHandler(Table_Cleared);
// Add a TableClearing event handler.
table.TableClearing += new
DataTableClearEventHandler(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();
}
private static void Row_Changed(object sender, DataRowChangeEventArgs e)
{
Console.WriteLine("Row_Changed Event: name={0}; action={1}",
e.Row["name"], e.Action);
}
private static void Row_Changing(object sender, DataRowChangeEventArgs e)
{
Console.WriteLine("Row_Changing Event: name={0}; action={1}",
e.Row["name"], e.Action);
}
private static void Row_Deleted(object sender, DataRowChangeEventArgs e)
{
Console.WriteLine("Row_Deleted Event: name={0}; action={1}",
e.Row["name", DataRowVersion.Original], e.Action);
}
private static void Row_Deleting(object sender,
DataRowChangeEventArgs e)
{
Console.WriteLine("Row_Deleting Event: name={0}; action={1}",
e.Row["name"], e.Action);
}
private static void Column_Changed(object sender, DataColumnChangeEventArgs e)
{
Console.WriteLine("Column_Changed Event: ColumnName={0}; RowState={1}",
e.Column.ColumnName, e.Row.RowState);
}
private static void Column_Changing(object sender, DataColumnChangeEventArgs e)
{
Console.WriteLine("Column_Changing Event: ColumnName={0}; RowState={1}",
e.Column.ColumnName, e.Row.RowState);
}
private static void Table_NewRow(object sender,
DataTableNewRowEventArgs e)
{
Console.WriteLine("Table_NewRow Event: RowState={0}",
e.Row.RowState.ToString());
}
private static void Table_Cleared(object sender, DataTableClearEventArgs e)
{
Console.WriteLine("Table_Cleared Event: TableName={0}; Rows={1}",
e.TableName, e.Table.Rows.Count.ToString());
}
private 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