共用方式為


處理 DataTable 事件

物件 DataTable 提供一系列可由應用程式處理的事件。 下表描述 DataTable 事件。

事件 說明
Initialized 發生在呼叫EndInit方法後的DataTable。 此事件主要是為了支持設計階段場景。
ColumnChanged DataColumn 的值成功變更後發生。
ColumnChanging 當已為DataColumn提交了一個值時發生。
RowChanged DataColumn值或RowStateDataRowDataTable成功變更後發生。
RowChanging DataColumn 中提交了 RowState 變更,針對的是 DataRowDataTable 或其值時發生。
RowDeleted 發生在 DataRow 中的 DataTable 已被標示為 Deleted之後。
RowDeleting DataRow 中,DataTable 之前會標示為 Deleted
TableCleared 呼叫ClearDataTable方法成功清除每個DataRow之後發生。
TableClearing 發生在呼叫 Clear 方法之後,但在 Clear 作業開始之前。
TableNewRow 在通過DataRow的方法NewRow創建新的DataTable之後發生。
Disposed 發生於DataTableDisposed的時候。 繼承自 MarshalByValueComponent

備註

新增或刪除數據列的大部分作業都不會引發 ColumnChangedColumnChanging 事件。 不過,ReadXml 方法會引發 ColumnChangedColumnChanging 事件,除非在閱讀為 XmlReadMode 的 XML 文件時,DiffGram 設定為 AutoDiffGram

警告

如果資料在DataSet中被修改,從而引發RowChanged事件,就會發生資料損毀。 如果發生這類數據損毀,則不會引發任何例外狀況。

屬性 Constraints 會保存 ConstraintCollection 實例。 ConstraintCollection 類別會公開 CollectionChanged 事件。 當從 ConstraintCollection新增、修改或移除條件約束時,就會引發此事件。

屬性 Columns 會保存 DataColumnCollection 實例。 DataColumnCollection 類別會公開 CollectionChanged 事件。 當在 DataColumn中新增、修改或移除DataColumnCollection時,會觸發此事件。 導致事件被觸發的修改包括變更資料行的名稱、類型、表達式或序數位置。

TablesDataSet 屬性會保存 DataTableCollection 實例。 類別 DataTableCollection 會公開 CollectionChangedCollectionChanging 事件。 當DataTable被新增至DataSet或從DataSet中移除時,這些事件會觸發。

更改DataRows也可能觸發相關DataView的事件。 類別 DataView 會公開一個事件,該事件會在 ListChanged 值變更或檢視的組成或排序順序變更時引發。 DataRowView 類別會公開一個事件,當相關聯的 PropertyChanged 值變更時觸發。

作業順序

以下是新增、修改或刪除 時 DataRow 所發生的作業順序:

  1. 建立建議的記錄並套用任何變更。

  2. 檢查非表達式欄位的條件約束。

  3. RowChangingRowDeleting事件根據需要引發。

  4. 將建議的記錄設定為當前記錄。

  5. 更新任何相關聯的索引。

  6. 引發與ListChanged物件相關聯的DataView事件,以及與PropertyChanged物件相關聯的DataRowView事件。

  7. 評估所有運算式欄位,但延遲檢查這些欄位上的任何約束條件。

  8. 針對受表達式數據行評估影響的相關ListChanged物件引發DataView事件,並針對相關PropertyChanged物件引發DataRowView事件。

  9. 視需要引發 RowChangedRowDeleted 事件。

  10. 檢查運算式欄位的限制。

備註

表達式數據行的變更永遠不會引發 DataTable 事件。 表達式數據行的變更只會引發 DataViewDataRowView 事件。 表達式欄位可以相依於多個其他欄位,而且可以在單次DataRow作業期間多次進行評估。 每個表達式評估都會引發事件,而且當表達式數據行受到影響時,單 DataRow 一作業可能會引發多個 ListChangedPropertyChanged 事件,可能包括相同表達式數據行的多個事件。

警告

請勿在NullReferenceException事件處理程式內擲回 RowChanged 。 如果在NullReferenceExceptionRowChanged事件中擲回DataTable,則DataTable會損毀。

範例

以下範例示範如何為 RowChangedRowChangingRowDeletedRowDeletingColumnChangedColumnChangingTableNewRowTableClearedTableClearing 事件建立事件處理程式。 當引發事件時,每個事件處理器都會在控制台視窗中顯示輸出。

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

另請參閱