Поделиться через


Обработка событий 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:

  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 = [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

См. также