Обработка событий таблиц данных

Объект 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 надо выполнить следующую последовательность операций.

  1. Создайте предложенную запись и внесите любые изменения.

  2. Проверьте ограничения для столбцов, не входящих в выражения.

  3. Вызовите событие RowChanging или RowDeleting, в зависимости от ситуации.

  4. Сделайте предложенную запись текущей.

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

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

  7. Оцените все столбцы выражения, но отложите проверку любых ограничений для этих столбцов.

  8. Вызовите события ListChanged для ассоциированных объектов DataView, а также события PropertyChanged для ассоциированных объектов DataRowView, затронутых оценками столбцов выражения.

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

  10. Проверьте ограничения на столбцы выражения.

Примечание.

Внесение изменений в столбцы выражений никогда не вызывает события 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

См. также