【问题标题】:C# Custom Event HandlerC# 自定义事件处理程序
【发布时间】:2009-11-19 17:46:51
【问题描述】:

我是一个学习 c# 的人,我有一个带有父表单和子表单的程序。我希望子窗体引发一个事件,以便父窗体可以做某事。我复制了一些代码,但我不够聪明,看不出有什么问题。我不知道如何正确编码子表单中的事件。错误是未定义 DatasourceUpdated。任何人都可以帮助我提出修复建议吗?

在我的子表单中

public partial class Form2 : Form
{
   public EventHandler DataSourceUpdated;
   ...
   private void button2_Click(object sender, EventArgs e)  //Done button
   {
       if (this.DataSourceUpdated != null) //raise the event
       {
           this.DatasourceUpdated();
       }

       this.Close();
   }

在父表单中我有这个:

private void myAddRecord()
{
    string myID = string.Empty;
    string myMessage = "Insert";

    Form2 myForm = new Form2(myID, myMessage);

    Form2.DatasourceUpdated += ChildUpdated;
    myForm.Show();

【问题讨论】:

  • ChildUpdated 在哪里定义?你能给我们看看代码吗?
  • 我有一个名为 InsertRecord 的方法来处理子表单上的 SQL 更新。我需要从 InsertRecord 的结果中设置 DataSourceUpdated 还是我只有事件处理程序引用 InsertRecord?
  • @Mark W,您不应该编辑问题中的错误。现在,如果有人阅读您的问题,他们将看不到您遇到的实际问题,并且可能没有意识到您已经使用“固定”代码更新了您的问题,导致他们可能认为您发布的内容实际上是不正确的。
  • 对不起,忽略我的最后评论。我完全忽略了细微差别。

标签: c# events


【解决方案1】:

现在,您声明的是 EventHandler,而不是事件。将其更改为:

public partial class Form2 : Form
{   
    public event EventHandler DataSourceUpdated;
       ...   
    private void button2_Click(object sender, EventArgs e)  //Done button   
    {
       if (this.DataSourceUpdated != null) //raise the event       
        {           
            this.DataSourceUpdated(this, EventArgs.Empty);       
        }       
        this.Close();   
    }

另外,当你去订阅你的事件时,你需要在实例上订阅事件,而不是在类上:

Form2 myForm = new Form2(myID, myMessage);
myForm.DataSourceUpdated+= ChildUpdated;
myForm.Show();

这是因为事件是在实例级别声明的,而不是静态声明的。

【讨论】:

    【解决方案2】:
    Form2.DatasourceUpdated += ...
    

    你正在尝试将你的处理程序附加到类上试试这个

    myForm.DatasourceUpdated += ...
    

    【讨论】:

    • Form2 类中也存在问题,即事件的声明和引发方式。
    【解决方案3】:

    据我所知,只要您有一个实际的处理程序,您的代码看起来是正确的;您尚未将其包含在代码中。 ChildUpdated 需要是带有签名void (object sender, EventArgs e) 的方法,并且您还应该像this.DataSourceUpdated(this, null); 那样引发事件

    签名是由您声明事件由具有该签名的System.EventHandler 处理的事实指定的。如果您希望它接收一些特殊参数或根本不接收参数,您也可以创建自己的委托。

    此外,您的示例中的大小写不准确,this.DatasourceUpdated -> this.DataSourceUpdated,但我假设这只是在您的示例中...?

    【讨论】:

      【解决方案4】:

      .NET 事件同时具有“发送者”对象和“EventArgs”对象。调用事件时需要包含这些内容。

      例如:

      private void button2_Click(object sender, EventArgs e)  //Done button
      {
          if (this.DataSourceUpdated != null) //raise the event
          {
              this.DatasourceUpdated(this, EventArgs.Empty);
          }
      
          this.Close();
      }
      

      【讨论】:

      • 他也将其声明为代表,而不是事件。
      【解决方案5】:

      首先有一个小错字:DatasourceUpdated vs DataSourceUpdated。看到大写的S了吗?另外,不要忘记参数并将DataSourceUpdated 声明为event

      public event EventHandler DataSourceUpdated;
      
      ...
      
      this.DataSourceUpdated(this, EventArgs.Empty); 
      

      我注意到的另一个问题是,当您应该调用实例成员时却调用了静态成员:

      Form2.DatasourceUpdated += ChildUpdated;
      

      myForm.DatasourceUpdated += ChildUpdated;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多