Обработка событий DataTable (ADO.NET)

Объект 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.Эти события возникают при добавлении или удалении из коллекции DataSet объекта DataTable.

Внесение изменений в объекты 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.Каждый обработчик события при возникновении события отображает выводимые данные в консольном окне.

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
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());
}

См. также

Основные понятия

Обработка событий DataAdapter (ADO.NET)

Обработка событий DataSet (ADO.NET)

Другие ресурсы

Обработка данных в DataTable