Обработка событий таблиц данных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.

Свойство 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:

  1. Создайте предложенную запись и внесите любые изменения.Create the proposed record and apply any changes.

  2. Проверьте ограничения для столбцов, не входящих в выражения.Check constraints for non-expression columns.

  3. Вызовите событие RowChanging или RowDeleting, в зависимости от ситуации.Raise the RowChanging or RowDeleting events as applicable.

  4. Сделайте предложенную запись текущей.Set the proposed record to be the current record.

  5. Обновите все ассоциированные индексы.Update any associated indexes.

  6. Вызовите события ListChanged для ассоциированных объектов DataView, а также события PropertyChanged для ассоциированных объектов DataRowView.Raise ListChanged events for associated DataView objects and PropertyChanged events for associated DataRowView objects.

  7. Оцените все столбцы выражения, но отложите проверку любых ограничений для этих столбцов.Evaluate all expression columns, but delay checking any constraints on these columns.

  8. Вызовите события ListChanged для ассоциированных объектов DataView, а также события PropertyChanged для ассоциированных объектов DataRowView, затронутых оценками столбцов выражения.Raise ListChanged events for associated DataView objects and PropertyChanged events for associated DataRowView objects affected by the expression column evaluations.

  9. Вызовите событие RowChanged или RowDeleted, в зависимости от ситуации.Raise RowChanged or RowDeleted events as applicable.

  10. Проверьте ограничения на столбцы выражения.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 DataTable = 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

См. такжеSee also