处理 DataTable 事件 (ADO.NET)
DataTable 对象提供一系列可以由应用程序处理的事件。下表描述了 DataTable 事件。
事件 |
说明 |
---|---|
在调用 DataTable 的 EndInit 方法后发生。此事件主要用于支持设计时方案。 |
|
在成功更改 DataColumn 中的值后发生。 |
|
提交 DataColumn 的值后发生。 |
|
在提交对 DataColumn 值或 DataTable 中 DataRow 的 RowState 的更改后发生。 |
|
在 DataTable 中的 DataRow 已标记为 Deleted 后发生。 |
|
在 DataTable 中的 DataRow 标记为 Deleted 前发生。 |
|
在对 DataTable 的 Clear 方法的调用已成功清除每个 DataRow 后发生。 |
|
在调用 Clear 方法后,开始执行 Clear 操作前发生。 |
|
在对 DataTable 的 NewRow 方法的调用创建了新 DataRow 后发生。 |
|
在 DataTable 被 Disposed 时发生。从 MarshalByValueComponent 继承。 |
注意 |
---|
添加或删除行的大多数操作不会引发 ColumnChanged 和 ColumnChanging 事件。但是,当要读取的 XML 文档为 DiffGram 时,除非将 XmlReadMode 设置为 DiffGram 或 Auto,否则 ReadXml 方法会引发 ColumnChanged 和 ColumnChanging 事件。 |
警告 |
---|
如果在从中引发 RowChanged 事件的 DataSet 中修改数据,则会发生数据损坏。出现这类数据损坏并不会引发任何异常。 |
其他相关事件
Constraints 属性包含 ConstraintCollection 实例。ConstraintCollection 类会公开 CollectionChanged 事件。在 ConstraintCollection 中添加、修改约束,或从中删除约束时,会激发此事件。
Columns 属性包含 DataColumnCollection 实例。DataColumnCollection 类会公开 CollectionChanged 事件。在 DataColumnCollection 中添加、修改或从中删除 DataColumn 时,会激发此事件。导致激发此事件的修改包括更改列的名称、类型、表达式或序号位置。
DataSet 的 Tables 属性包含 DataTableCollection 实例。DataTableCollection 类会公开 CollectionChanged 和 CollectionChanging 事件。向 DataSet 中添加或从中删除 DataTable 时,会激发这两个事件。
更改 DataRows 还会触发已关联 DataView 的事件。DataView 类会公开 ListChanged 事件,当 DataColumn 值发生更改或视图的撰写或排序顺序发生更改时会激发此事件。DataRowView 类会公开 PropertyChanged 事件,当关联的 DataColumn 值发生更改时会激发此事件。
操作顺序
下面是添加、修改或删除 DataRow 时所执行操作的顺序:
创建建议的记录并应用任何更改。
检查非表达式列的约束。
如适用,引发 RowChanging 或 RowDeleting 事件。
将建议的记录设置为当前记录。
更新任何关联的索引。
为关联的 DataView 对象引发 ListChanged 事件;为关联的 DataRowView 对象引发 PropertyChanged 事件。
计算所有表达式列,但延迟检查对这些列的任何约束。
为关联的 DataView 对象引发 ListChanged 事件;为受表达式列计算影响的 DataRowView 对象引发 PropertyChanged 事件。
如适用,引发 RowChanged 或 RowDeleted 事件。
检查对表达式列的约束。
注意 |
---|
更改表达式列绝不会引发 DataTable 事件。更改表达式列只会引发 DataView 和 DataRowView 事件。表达式列可与多个其他列存在相关性,并且在单个 DataRow 操作期间可计算多次。每个表达式计算都可引发事件,并且当表达式列受影响时,单个 DataRow 操作可引发多个 ListChanged 和 PropertyChanged 事件,其中可能包括同一表达式列的多个事件。 |
警告 |
---|
请勿在 RowChanged 事件处理程序中引发 NullReferenceException。如果在 DataTable 的 RowChanged 事件中引发了 NullReferenceException,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());
}