繁体   English   中英

C#自定义事件处理程序

[英]C# Custom Event Handler

我是一个学习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();

现在,您声明的是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();

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

Form2.DatasourceUpdated += ...

您正在尝试将您的处理程序附加到该类上,请改用

myForm.DatasourceUpdated += ...

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

通过将事件声明为由具有该签名的System.EventHandler处理的事实来指定签名。 如果希望它接收某些特殊参数或根本不接收任何参数,则也可以创建自己的委托。

另外,您的示例中有一个不正确的大小写, this.DatasourceUpdated > this.DataSourceUpdated ,但是我假设这只是您的示例...?

.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();
}

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

public event EventHandler DataSourceUpdated;

...

this.DataSourceUpdated(this, EventArgs.Empty); 

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

Form2.DatasourceUpdated += ChildUpdated;

myForm.DatasourceUpdated += ChildUpdated;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM