Share via


DataTable イベントの処理 (ADO.NET)

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

イベント

説明

Initialized

DataTable の EndInit メソッドが呼び出された後に発生します。このイベントは、主にデザイン時のシナリオをサポートすることを目的としています。

ColumnChanged

DataColumn で値が正常に変更された後に発生します。

ColumnChanging

DataColumn に対して値が送信されたときに発生します。

RowChanged

DataColumn 値または DataTable の DataRowRowState が正常に変更された後で発生します。

RowChanging

DataColumn 値または DataTable の DataRow の RowState に対して変更が送信されたときに発生します。

RowDeleted

DataTable の DataRow が Deleted としてマークされた後に発生します。

RowDeleting

DataTable の DataRow が Deleted としてマークされる前に発生します。

TableCleared

DataTable の Clear メソッドがすべての DataRow を正常にクリアした後で発生します。

TableClearing

Clear メソッドが呼び出された後、Clear 操作が開始される前に発生します。

TableNewRow

DataTable の NewRow メソッドの呼び出しにより、新しい DataRow が作成された後で発生します。

Disposed

DataTable が破棄 (Disposed) されたときに発生します。MarshalByValueComponent から継承されています。

メモメモ

行の追加または削除を行う操作の多くは、ColumnChanged イベントも ColumnChanging イベントも生成しません。ただし、ReadXml メソッドでは、XmlReadMode が DiffGram または Auto (読み込む XML ドキュメントが DiffGram の場合) に設定されていない限り、ColumnChanged イベントおよび ColumnChanging イベントが生成されます。

Caution メモ注意

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

その他の関連イベント

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

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

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

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 イベントが発生し、同じ式列に対して複数のイベントが発生する場合もあります。

Caution メモ注意

NullReferenceException を RowChanged イベント ハンドラー内でスローしないでください。NullReferenceException が DataTable の RowChanged イベント内でスローされると、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 内のデータの操作