次の方法で共有


DataTable イベントの処理

DataTable オブジェクトは、アプリケーションで処理できる一連のイベントを提供します。 次の表では、 DataTable イベントについて説明します。

出来事 説明
Initialized DataTableEndInit メソッドが呼び出された後に発生します。 このイベントは、主にデザイン時のシナリオをサポートすることを目的としています。
ColumnChanged DataColumnで値が正常に変更された後に発生します。
ColumnChanging DataColumnの値が送信されたときに発生します。
RowChanged DataColumn値またはDataTable内のDataRowRowStateが正常に変更された後に発生します。
RowChanging DataTable内のDataRowDataColumn値またはRowStateに対して変更が送信されたときに発生します。
RowDeleted DataTableDataRowDeletedとしてマークされた後に発生します。
RowDeleting DataTable内のDataRowDeletedとしてマークされる前に発生します。
TableCleared DataTableClear メソッドの呼び出しが、すべてのDataRowを正常にクリアした後に発生します。
TableClearing Clear メソッドが呼び出された後、Clear操作が開始される前に発生します。
TableNewRow DataTableNewRow メソッドの呼び出しによって新しいDataRowが作成された後に発生します。
Disposed DataTableDisposedされたときに発生します。 このプロパティは、MarshalByValueComponent から継承されています。

行を追加または削除するほとんどの操作では、 ColumnChanged イベントと ColumnChanging イベントは発生しません。 ただし、ReadXml メソッドは、XmlReadModeDiffGramに設定されているか、読み取られる XML ドキュメントがDiffGramのときにAutoに設定されていない限り、ColumnChangedおよびColumnChangingイベントを発生させます。

Warnung

データの破損は、RowChanged イベントが発生したDataSetでデータが変更された場合に発生する可能性があります。 このようなデータの破損が発生した場合、例外は発生しません。

Constraints プロパティは、ConstraintCollection インスタンスを保持します。 ConstraintCollection クラスは、CollectionChanged イベントを公開します。 このイベントは、制約が ConstraintCollectionに追加、変更、または削除されたときに発生します。

Columns プロパティは、DataColumnCollection インスタンスを保持します。 DataColumnCollection クラスは、CollectionChanged イベントを公開します。 このイベントは、 DataColumnDataColumnCollectionに追加、変更、または削除されたときに発生します。 イベントが発生する原因となる変更には、列の名前、型、式、または序数の位置の変更が含まれます。

DataSetTables プロパティは、DataTableCollection インスタンスを保持します。 DataTableCollection クラスは、CollectionChangedイベントとCollectionChanging イベントの両方を公開します。 これらのイベントは、 DataTableDataSetに追加または削除されたときに発生します。

DataRowsに変更を加えて、関連付けられているDataViewのイベントをトリガーすることもできます。 DataView クラスは、DataColumn値が変更されたとき、またはビューの構成または並べ替え順序が変更されたときに発生するListChanged イベントを公開します。 DataRowView クラスは、関連付けられたDataColumn値が変更されたときに発生するPropertyChanged イベントを公開します。

操作のシーケンス

DataRowが追加、変更、または削除されたときに発生する一連の操作を次に示します。

  1. 提案されたレコードを作成し、変更を適用します。

  2. 式以外の列の制約を確認します。

  3. 必要に応じて、 RowChanging または RowDeleting イベントを発生させます。

  4. 提案されたレコードを現在のレコードに設定します。

  5. 関連付けられているインデックスを更新します。

  6. 関連付けられたDataView オブジェクトのListChanged イベントと、関連付けられたDataRowView オブジェクトのPropertyChanged イベントを発生させます。

  7. すべての式列を評価しますが、これらの列に対する制約のチェックは遅延します。

  8. 関連付けられたDataView オブジェクトのListChanged イベントと、式列の評価の影響を受ける関連付けられたDataRowView オブジェクトのPropertyChangedイベントを発生させます。

  9. 必要に応じて、 RowChanged または RowDeleted イベントを発生させます。

  10. 式列の制約を確認します。

式列に対する変更では、イベント DataTable 発生することはありません。 式列に対する変更では、 DataView イベントと DataRowView イベントのみが発生します。 式列は、他の複数の列に依存関係を持つ可能性があり、1 つの DataRow 操作中に複数回評価できます。 各式の評価ではイベントが発生し、1 つの DataRow 操作で、式列が影響を受けるときに複数の ListChanged イベントと PropertyChanged イベントを発生させることができます。場合によっては、同じ式列に対して複数のイベントを含めることができます。

Warnung

RowChanged イベント ハンドラー内でNullReferenceExceptionをスローしないでください。 DataTableRowChanged イベント内でNullReferenceExceptionがスローされた場合、DataTableは破損します。

次の例では、 RowChangedRowChangingRowDeletedRowDeletingColumnChangedColumnChangingTableNewRowTableCleared、および 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

こちらも参照ください