C#自定义事件处理程序

时间:2009-11-19 17:46:52

标签: c# events

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

5 个答案:

答案 0 :(得分:4)

现在,你宣布一个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();

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

答案 1 :(得分:2)

Form2.DatasourceUpdated += ...

你试图将你的处理程序附加到类中试试这个

myForm.DatasourceUpdated += ...

答案 2 :(得分:1)

只要你有一个实际的处理程序,你的代码看起来是正确的,据我所知。你没有在你的代码中包含它。 ChildUpdated需要是一个带有签名void (object sender, EventArgs e)的方法,您还应该像this.DataSourceUpdated(this, null);

那样举起活动

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

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

答案 3 :(得分:0)

.NET事件同时具有“sender”对象和“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();
}

答案 4 :(得分:0)

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

public event EventHandler DataSourceUpdated;

...

this.DataSourceUpdated(this, EventArgs.Empty); 

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

Form2.DatasourceUpdated += ChildUpdated;

myForm.DatasourceUpdated += ChildUpdated;