如何将事件处理程序添加到表适配器中的RowUpdated事件

Sim*_*mon 7 c# ado.net

我有一个tableadapter,我想在触发RowUpdated事件时做一些事情.我无法弄清楚将代码添加到事件的处理器的位置.

public partial class MyTableAdapter
{
  void OnRowUpdated(object sender, System.Data.Odbc.OdbcRowUpdatedEventArgs e)
  {
  }
}
Run Code Online (Sandbox Code Playgroud)

如何在创建TableAdapter时运行以下代码?

Adapter.RowUpdated += 
                   new System.Data.Odbc.OdbcRowUpdatedEventHandler(OnRowUpdated);
Run Code Online (Sandbox Code Playgroud)

Bop*_*Bop 3

我分两个阶段解决了这个问题。

A。添加部分类并扩展表适配器

b. 在使用此适配器之前首先调用一个方法(例如在创建它的实例之后在主窗体中)。

下面的代码是为了解决我使用 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

主窗体中的调用:

        tableAdapter = new ScannedItemsTableAdapter();
        tableAdapter.Fill(ds.ScannedItems);
        tableAdapter.InitEvents();
Run Code Online (Sandbox Code Playgroud)