C#自定义事件处理程序

C#自定义事件处理程序,c#,events,C#,Events,我是一个学习c#的人,我有一个带有父窗体和子窗体的程序。我希望子窗体引发事件,以便父窗体可以执行某些操作。我复制了一些代码,但我不够聪明,看不出哪里出了问题。我不知道如何在子窗体中正确地编写事件代码。错误为DatasourceUpdate未定义。有人能帮我推荐一个解决方案吗 以我的孩子的形式 public partial class Form2 : Form { public EventHandler DataSourceUpdated; ... private void bu

我是一个学习c#的人,我有一个带有父窗体和子窗体的程序。我希望子窗体引发事件,以便父窗体可以执行某些操作。我复制了一些代码,但我不够聪明,看不出哪里出了问题。我不知道如何在子窗体中正确地编写事件代码。错误为DatasourceUpdate未定义。有人能帮我推荐一个解决方案吗

以我的孩子的形式

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();
.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();
}
您正在尝试将处理程序附加到类,请改为尝试以下操作

myForm.DatasourceUpdated += ...

首先有一个小错误:
DatasourceUpdated
vs
DatasourceUpdated
。看到首都S了吗?另外,不要忘记args并将
数据源更新
声明为
事件

public event EventHandler DataSourceUpdated;

...

this.DataSourceUpdated(this, EventArgs.Empty); 
我注意到的另一个问题是,在应该调用实例成员时调用静态成员:

Form2.DatasourceUpdated += ChildUpdated;


现在,您正在声明一个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();

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

据我所知,您的代码看起来是正确的,只要您有一个实际的处理程序;您还没有在代码中包含这一点
ChildUpdated
需要是一个签名为void的方法(objectsender,EventArgs e),您还应该像
this.DataSourceUpdated(this,null)那样引发事件

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


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

ChildUpdated在哪里定义?你能给我们看一下代码吗?我有一个名为InsertRecord的方法,它处理子窗体上的SQL更新。我是否需要根据InsertRecord的结果设置DataSourceUpdate,还是只使用eventhandler引用InsertRecord?@Mark W,您不应该编辑这些错误。现在,如果有人阅读你的问题,他们将看不到你的实际问题,并且可能没有意识到你用“固定”代码更新了你的问题,这可能会使他们认为你发布的内容实际上是不正确的。对不起,忽略我的上一条评论。我完全忽略了其中的细微差别。他还将其声明为一个委托,而不是一个事件。Form2类中也存在一些问题,即事件是如何声明和引发的。
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();