DataTable イベントの処理Handling DataTable Events

DataTable オブジェクトは、アプリケーションが処理できる一連のイベントを提供します。The DataTable object provides a series of events that can be processed by an application. DataTable のイベントを次の表に示します。The following table describes DataTable events.

イベントEvent 説明Description
Initialized EndInitDataTable メソッドが呼び出された後に発生します。Occurs after the EndInit method of a DataTable is called. このイベントは、主にデザイン時のシナリオをサポートすることを目的としています。This event is intended primarily to support design-time scenarios.
ColumnChanged DataColumn で値が正常に変更された後に発生します。Occurs after a value has been successfully changed in a DataColumn.
ColumnChanging DataColumn に対して値が送信されたときに発生します。Occurs when a value has been submitted for a DataColumn.
RowChanged DataColumn 値または RowStateDataRowDataTable が正常に変更された後で発生します。Occurs after a DataColumn value or the RowState of a DataRow in the DataTable has been changed successfully.
RowChanging DataColumn 値または RowStateDataRowDataTable に対して変更が送信されたときに発生します。Occurs when a change has been submitted for a DataColumn value or the RowState of a DataRow in the DataTable.
RowDeleted DataRowDataTableDeleted としてマークされた後に発生します。Occurs after a DataRow in the DataTable has been marked as Deleted.
RowDeleting DataRowDataTableDeleted としてマークされる前に発生します。Occurs before a DataRow in the DataTable is marked as Deleted.
TableCleared ClearDataTable メソッドがすべての DataRow を正常にクリアした後で発生します。Occurs after a call to the Clear method of the DataTable has successfully cleared every DataRow.
TableClearing Clear メソッドが呼び出された後、Clear 操作が開始される前に発生します。Occurs after the Clear method is called but before the Clear operation begins.
TableNewRow DataRowNewRow メソッドの呼び出しにより、新しい DataTable が作成された後で発生します。Occurs after a new DataRow is created by a call to the NewRow method of the DataTable.
Disposed DataTable が破棄 (Disposed) されたときに発生します。Occurs when the DataTable is Disposed. このプロパティは、MarshalByValueComponent から継承されています。Inherited from MarshalByValueComponent.

注意

行の追加または削除を行う操作の多くは、ColumnChanged イベントも ColumnChanging イベントも生成しません。Most operations that add or delete rows do not raise the ColumnChanged and ColumnChanging events. ただし、ReadXml メソッドでは、ColumnChangedColumnChanging または XmlReadMode (読み込む XML ドキュメントが DiffGram の場合) に設定されていない限り、Auto イベントおよび DiffGram イベントが生成されます。However, the ReadXml method does raise ColumnChanged and ColumnChanging events, unless the XmlReadMode is set to DiffGram or is set to Auto when the XML document being read is a DiffGram.

警告

DataSet イベントの生成元の RowChanged でデータが変更されると、データが破損する可能性があります。Data corruption can occur if data is modified in a DataSet from which the RowChanged event is raised. このようなデータの破損が起きた場合、例外は発生しません。No exception will be raised if such data corruption occurs.

Constraints プロパティは ConstraintCollection インスタンスを保持します。The Constraints property holds a ConstraintCollection instance. ConstraintCollection クラスは、CollectionChanged イベントを公開します。The ConstraintCollection class exposes a CollectionChanged event. このイベントは、ConstraintCollection に対して制約の追加、変更、または削除が実行されたときに発生します。This event fires when a constraint is added, modified, or removed from the ConstraintCollection.

Columns プロパティは DataColumnCollection インスタンスを保持します。The Columns property holds a DataColumnCollection instance. DataColumnCollection クラスは、CollectionChanged イベントを公開します。The DataColumnCollection class exposes a CollectionChanged event. このイベントは、DataColumn が追加、変更、または DataColumnCollection から削除されたときに発生します。This event fires when a DataColumn is added, modified, or removed from the DataColumnCollection. イベントの発生を伴う変更には、名前の変更、型の変更、式の変更、列の序数位置の変更などがあります。Modifications that cause the event to fire include changes to the name, type, expression or ordinal position of a column.

TablesDataSet プロパティは DataTableCollection インスタンスを保持します。The Tables property of a DataSet holds a DataTableCollection instance. DataTableCollection クラスは、CollectionChanged イベントと CollectionChanging イベントの両方を公開します。The DataTableCollection class exposes both a CollectionChanged and a CollectionChanging event. これらのイベントは、DataTable に対して、DataSet の追加、変更、または削除が実行されたときに発生します。These events fire when a DataTable is added to or removed from the DataSet.

DataRows への変更によって、関連する DataView のイベントがトリガーされる場合もあります。Changes to DataRows can also trigger events for an associated DataView. DataView クラスは、ListChanged 値が変更されたとき、または、ビューの構成や並べ替え順が変更されたときに発生する DataColumn イベントを公開します。The DataView class exposes a ListChanged event that fires when a DataColumn value changes or when the composition or sort order of the view changes. DataRowView クラスは、関連する PropertyChanged 値が変更されたときに発生する DataColumn イベントを公開します。The DataRowView class exposes a PropertyChanged event that fires when an associated DataColumn value changes.

操作の順序Sequence of Operations

DataRow が追加、変更、または削除されたときに発生する操作の順序について説明します。Here is the sequence of operations that occur when a DataRow is added, modified, or deleted:

  1. 提示されたレコードを作成し、変更を適用します。Create the proposed record and apply any changes.

  2. 式以外の列の制約をチェックします。Check constraints for non-expression columns.

  3. 適宜 RowChanging イベントまたは RowDeleting イベントを発生させます。Raise the RowChanging or RowDeleting events as applicable.

  4. 提示されたレコードを現在のレコードとして設定します。Set the proposed record to be the current record.

  5. 関連するインデックスをすべて更新します。Update any associated indexes.

  6. 関連する ListChanged オブジェクトの DataView イベントおよび関連する PropertyChanged オブジェクトの DataRowView イベントを発生させます。Raise ListChanged events for associated DataView objects and PropertyChanged events for associated DataRowView objects.

  7. すべての式列を評価します。ただし、これらの列に対する制約のチェックは、この段階では行われません。Evaluate all expression columns, but delay checking any constraints on these columns.

  8. 式列の評価によって影響を受ける、関連する ListChanged オブジェクトの DataView イベントおよび関連する PropertyChanged オブジェクトの DataRowView イベントを発生させます。Raise ListChanged events for associated DataView objects and PropertyChanged events for associated DataRowView objects affected by the expression column evaluations.

  9. 適宜 RowChanged イベントまたは RowDeleted イベントを発生させます。Raise RowChanged or RowDeleted events as applicable.

  10. 式列の制約をチェックします。Check constraints on expression columns.

注意

式列に対する変更で DataTable のイベントが発生することはありません。Changes to expression columns never raise DataTable events. 式列に対する変更で発生するのは、DataViewDataRowView のイベントだけです。Changes to expression columns only raise DataView and DataRowView events. 式列には他の複数の列に対する依存関係が存在することもあるため、1 回の DataRow 操作で複数回、評価される場合もあります。Expression columns can have dependencies on multiple other columns, and can be evaluated multiple times during a single DataRow operation. イベントは式が評価されるたびに発生するため、式列が変更された場合、1 回の DataRow 操作で複数の ListChanged イベントおよび PropertyChanged イベントが発生し、同じ式列に対して複数のイベントが発生する場合もあります。Each expression evaluation raises events, and a single DataRow operation can raise multiple ListChanged and PropertyChanged events when expression columns are affected, possibly including multiple events for the same expression column.

警告

NullReferenceExceptionRowChanged イベント ハンドラー内でスローしないでください。Do not throw a NullReferenceException within the RowChanged event handler. NullReferenceExceptionRowChangedDataTable イベント内でスローされると、DataTable が破損します。If a NullReferenceException is thrown within the RowChanged event of a DataTable, then the DataTable will be corrupted.

Example

次の例では、RowChangedRowChangingRowDeletedRowDeletingColumnChangedColumnChangingTableNewRowTableClearedTableClearing の各イベントについてイベント ハンドラーを作成しています。The following example demonstrates how to create event handlers for the RowChanged, RowChanging, RowDeleted, RowDeleting, ColumnChanged, ColumnChanging, TableNewRow, TableCleared, and TableClearing events. イベントが発生すると、各イベント ハンドラーによって、出力結果がコンソール ウィンドウに表示されます。Each event handler displays output in the console window when it is fired.

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

関連項目See also