C#自定义事件处理程序

问题描述:

我是一个学习c#的人,我有一个带有父窗体和子窗体的程序。我希望子表单能够引发事件,以便父表单可以执行某些操作。我复制了一些代码,但我不够聪明,看不到有什么问题。我不知道如何在子窗体中正确编写事件。该错误是DatasourceUpdated未定义。任何人都可以帮我解决一个建议的问题吗?C#自定义事件处理程序

子窗体我有

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(); 
+1

ChildUpdated定义在哪里?你能告诉我们代码吗? – 2009-11-19 17:49:36

+0

我有一个名为InsertRecord的方法来处理子窗体上的SQL更新。我是否需要从InsertRecord的结果中设置DataSourceUpdated,还是只需要事件处理程序引用InsertRecord? – 2009-11-19 18:16:54

+0

@Mark W,你不应该编辑你的问题的错误。现在,如果有人读你的问题,他们不会看到你的实际问题,并可能没有意识到你用“固定”代码更新了你的问题,使他们也许认为你发布的内容实际上是不正确的。 – 2009-11-19 18:51:44

只要你有一个实际的处理程序,你的代码看起来是正确的,据我所知,你没有将它包含在你的代码中。 ChildUpdated需要是与签名void (object sender, EventArgs e),你应该也提出这样的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(); 
} 
+0

他也被宣布为代表,而不是事件。 – 2009-11-19 17:52:04

Form2.DatasourceUpdated += ... 

你试图附加处理程序的类试试这个,而不是

myForm.DatasourceUpdated += ... 
+0

Form2类也存在问题,该事件如何声明和引发。 – 2009-11-19 17:54:13

首先,有一个小错字:DatasourceUpdated VS DataSourceUpdated。看大写字母S?另外,不要忘了指定参数和申报DataSourceUpdatedevent

public event EventHandler DataSourceUpdated; 

... 

this.DataSourceUpdated(this, EventArgs.Empty); 

还有一个问题,我注意到的是,你打电话时,你应该调用一个实例成员静态成员:

Form2.DatasourceUpdated += ChildUpdated; 

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

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