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

时间:2010-07-14 06:38:40

标签: c# ado.net

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

public partial class MyTableAdapter
{
  void OnRowUpdated(object sender, System.Data.Odbc.OdbcRowUpdatedEventArgs e)
  {
  }
}

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

Adapter.RowUpdated += 
                   new System.Data.Odbc.OdbcRowUpdatedEventHandler(OnRowUpdated);

8 个答案:

答案 0 :(得分:3)

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

一个。添加部分类和扩展表适配器

湾在使用此适配器之前调用一个方法(在创建它的实例后以主窗体表示)。

下面的代码是为了解决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();

答案 1 :(得分:1)

我有一个可能的选择。

虽然可以在tableadapter分部类中订阅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

"发出哔​​哔声,我可以添加断点进行测试"

因为无论如何我必须订阅该活动,我认为这更直观,并且不需要任何"记住"

答案 2 :(得分:0)

编辑:显然,以下建议的步骤都没有用。我在这里完全保留这个答案,以便其他任何试图回答它的人都没有提出相同的建议。< / p>


您是否在设计师中创建了TableAdapter?如果是这样,您是否可以单击属性页面的“事件”部分,并在RowUpdated条目中键入“OnRowUpdated”?

如果您在代码中明确创建适配器,只需自己添加呼叫。

或者,你的部分类是否有一个被调用的构造函数?如果是这样,你可以在那里添加呼叫。

编辑:好的,所以可能是在特定的页面或表单中使用了 - 你可以在该页面/表单的InitializeComponent方法之后添加吗?

答案 3 :(得分:0)

http://windowsclient.net/learn/video.aspx?v=14625如果你看一下这个视频,你可以看到,你只需双击数据集设计器中的某些东西,就可以为你生成和连接事件......但是这只适用于VB程序员:))sux

答案 4 :(得分:0)

自从我上次使用这个东西已经有一段时间了,但是如果我没记错的话,你应该能够在你的部分类中覆盖EndInit()并添加初始代码,比如在那里添加你的事件处理程序......

答案 5 :(得分:0)

从那里覆盖你的C#类和fire事件处理程序

    public override void EndInit()
    {
        base.EndInit();
        Adapter.RowUpdated += 
                   new System.Data.Odbc.OdbcRowUpdatedEventHandler(OnRowUpdated);

    }

    void OnRowUpdated(object sender, System.Data.Odbc.OdbcRowUpdatedEventArgs e)
    {

    }

希望有帮助................

答案 6 :(得分:0)

// Assumes that connection is a valid SqlConnection object.

SqlDataAdapter custAdapter = new SqlDataAdapter(
  "SELECT CustomerID, CompanyName FROM Customers", connection);

// Add handlers.

custAdapter.RowUpdating += new SqlRowUpdatingEventHandler(OnRowUpdating);
custAdapter.RowUpdated += new SqlRowUpdatedEventHandler(OnRowUpdated);

// Set DataAdapter command properties, fill DataSet, modify DataSet.


custAdapter.Update(custDS, "Customers");

// Remove handlers.

custAdapter.RowUpdating -= new SqlRowUpdatingEventHandler(OnRowUpdating);
custAdapter.RowUpdated -= new SqlRowUpdatedEventHandler(OnRowUpdated);

protected static void OnRowUpdating(
  object sender, SqlRowUpdatingEventArgs args)
{
  if (args.StatementType == StatementType.Delete)
  {
    System.IO.TextWriter tw = System.IO.File.AppendText("Deletes.log");
    tw.WriteLine(
      "{0}: Customer {1} Deleted.", DateTime.Now, 
       args.Row["CustomerID", DataRowVersion.Original]);
    tw.Close();
  }
}

protected static void OnRowUpdated(
  object sender, SqlRowUpdatedEventArgs args)
{
  if (args.Status == UpdateStatus.ErrorsOccurred)
  {
    args.Row.RowError = args.Errors.Message;

    args.Status = UpdateStatus.SkipCurrentRow;
  }
}

答案 7 :(得分:0)

这是一个简单的方法,使用设计器。右键单击数据集(.xsd 文件)并选择查看代码。就像使用表单一样,它不会打开设计器代码。它会打开你的代码。这是您的代码:

namespace TimeTrack.TimeTrackDataSetTableAdapters
{
    public partial class TimeSlipsTableAdapter
    {
        public void CustomSetup()
        {
            Adapter.RowUpdated += Adapter_RowUpdated;
        }

        private void Adapter_RowUpdated(object sender, OleDbRowUpdatedEventArgs e)
        {
            // whatever you want to do when RowUpdated fires
        }
    }
}

在您的表单中,不要忘记

    public TimeEntry()
    {
        InitializeComponent();
        timeSlipsTableAdapter.CustomSetup();