如何添加事件处理程序到表适配器中的RowUpdated事件
我有一个tableadapter,并且我想在RowUpdated事件触发时做些事情。 我无法弄清楚把代码添加到事件处理程序的位置。
public partial class MyTableAdapter
{
void OnRowUpdated(object sender, System.Data.Odbc.OdbcRowUpdatedEventArgs e)
{
}
}
如何在TableAdapter创建时运行下面的代码?
Adapter.RowUpdated +=
new System.Data.Odbc.OdbcRowUpdatedEventHandler(OnRowUpdated);
我分两步解决了这个问题。
一个。 添加部分类和扩展表适配器
湾 在使用这个适配器之前在开始时调用一个方法(比如在创建它的实例之后在主窗体中)。
下面的代码是用SQL CE解决我的特定问题,以便能够更新表上的ID。 但是,您可以使用扩展方法来包装RowUpdated事件并将其暴露给其他类(即MyRowUpdated)
扩展名
public partial class ScannedItemsTableAdapter
{
public void InitEvents()
{
this._adapter.RowUpdated += _adapter_RowUpdated;
}
void _adapter_RowUpdated(object sender, SqlCeRowUpdatedEventArgs e)
{
if (e.Status == UpdateStatus.Continue &&
e.StatementType == StatementType.Insert)
{
var pk = e.Row.Table.PrimaryKey;
pk[0].ReadOnly = false;
SqlCeCommand cmd = new SqlCeCommand("SELECT @@IDENTITY",
e.Command.Connection, e.Command.Transaction);
object id = (decimal)cmd.ExecuteScalar();
e.Row[pk[0]] = Convert.ToInt32(id);
e.Row.AcceptChanges();
}
}
}
主要形式的电话:
tableAdapter = new ScannedItemsTableAdapter();
tableAdapter.Fill(ds.ScannedItems);
tableAdapter.InitEvents();
我有一个可能的选择。
虽然可以在tableadapter partial类中订阅tableadapters底层适配器,但我发现无法简单地初始化它,而无需记住调用自己的初始化。
不过,我发现我可以使用tableadpater直接从代码中订阅tableadapters.adapter.rowupdated事件,如下所示
AddHandler Me.TA_Case_Transactions.Adapter.RowUpdated, AddressOf Transaction_Row_Written
Private Sub Transaction_Row_Written(p_Sender As Object, p_E As SqlRowUpdatedEventArgs)
beep
End Sub
“哔哔声是我可以为测试添加一个断点”
由于我不得不订阅这个活动,我认为这更直观,并且不需要任何“记忆”
编辑: 显然,下面建议的步骤都不是很有用。 我在这里单纯地保留这个答案,以便其他人试图回答它并不会提出相同的建议。
你在设计器中创建TableAdapter
吗? 如果是这样,您是否可以不单击属性页面的Events部分,并在RowUpdated
条目中键入“OnRowUpdated”?
如果您要在代码中明确创建适配器,请自行添加该调用。
或者,你的部分类是否有一个被调用的构造函数? 同样,如果是这样,您可以在那里添加呼叫。
编辑:好吧,大概这是用在一个特定的页面或窗体 - 你可以将它添加到该页面/窗体的InitializeComponent
方法之后?
上一篇: How do I Add an Event Handler To the RowUpdated event in a table adapter