物件 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 | 呼叫ClearDataTable 方法成功清除每個DataRow 之後發生。 |
TableClearing | 發生在呼叫 Clear 方法之後,但在 Clear 作業開始之前。 |
TableNewRow | 在通過DataRow 的方法NewRow 創建新的DataTable 之後發生。 |
Disposed | 發生於DataTable 是Disposed 的時候。 繼承自 MarshalByValueComponent。 |
備註
新增或刪除數據列的大部分作業都不會引發 ColumnChanged
和 ColumnChanging
事件。 不過,ReadXml
方法會引發 ColumnChanged
和 ColumnChanging
事件,除非在閱讀為 XmlReadMode
的 XML 文件時,DiffGram
設定為 Auto
或 DiffGram
。
警告
如果資料在DataSet
中被修改,從而引發RowChanged
事件,就會發生資料損毀。 如果發生這類數據損毀,則不會引發任何例外狀況。
其他相關事件
屬性 Constraints 會保存 ConstraintCollection 實例。
ConstraintCollection 類別會公開 CollectionChanged 事件。 當從 ConstraintCollection
新增、修改或移除條件約束時,就會引發此事件。
屬性 Columns 會保存 DataColumnCollection 實例。
DataColumnCollection
類別會公開 CollectionChanged 事件。 當在 DataColumn
中新增、修改或移除DataColumnCollection
時,會觸發此事件。 導致事件被觸發的修改包括變更資料行的名稱、類型、表達式或序數位置。
Tables的 DataSet 屬性會保存 DataTableCollection 實例。 類別 DataTableCollection
會公開 CollectionChanged
和 CollectionChanging
事件。 當DataTable
被新增至DataSet
或從DataSet
中移除時,這些事件會觸發。
更改DataRows
也可能觸發相關DataView的事件。 類別 DataView
會公開一個事件,該事件會在 ListChanged 值變更或檢視的組成或排序順序變更時引發。
DataRowView 類別會公開一個事件,當相關聯的 PropertyChanged 值變更時觸發。
作業順序
以下是新增、修改或刪除 時 DataRow
所發生的作業順序:
建立建議的記錄並套用任何變更。
檢查非表達式欄位的條件約束。
RowChanging
或RowDeleting
事件根據需要引發。將建議的記錄設定為當前記錄。
更新任何相關聯的索引。
引發與
ListChanged
物件相關聯的DataView
事件,以及與PropertyChanged
物件相關聯的DataRowView
事件。評估所有運算式欄位,但延遲檢查這些欄位上的任何約束條件。
針對受表達式數據行評估影響的相關
ListChanged
物件引發DataView
事件,並針對相關PropertyChanged
物件引發DataRowView
事件。視需要引發
RowChanged
或RowDeleted
事件。檢查運算式欄位的限制。
備註
表達式數據行的變更永遠不會引發 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
另請參閱
- 操作 DataTable 中的數據
- 處理 DataAdapter 事件
- 處理資料集事件
- ADO.NET 概觀