C#,如何创建一个事件并在另一个类中监听它?

时间:2012-05-12 19:11:11

标签: c# winforms

我无法弄清楚如何做到这一点,继承样本代码。我想做什么。

public Class MainForm : Form
{
    MyUserControl MyControl = new MyUserControl;
    private void Button_Click(object sender, EventArgs e)
    {
        //Create MyEvent
    }    
}

public Class MyUserControl : UserControl
{
    //listen for MyEvent from MainForm, and perform MyMethod
    public void MyMethod()
    {
         //Do Stuff here
    }
}

3 个答案:

答案 0 :(得分:4)

步骤1)在MainForm上公开一个事件...说..

public event Action simpleEvent

步骤2)给MyUserControl一个构造函数,该构造函数接受一个MainForm实例并将一个动作绑定到该事件

public MyUserControl(MainForm form) {
    form += () => Console.WriteLine("We're doing something!")
}

步骤3)在MainForm.Button_Click

中引发事件
if(simpleEvent != null) simpleEvent();

注意:您可以注册自己的代理并使用lambda表达式以外的其他代码。有关更全面的说明,请参阅http://msdn.microsoft.com/en-us/library/17sde2xt.aspx

你的最终结果看起来像......

public Class MainForm : Form
{
    public event Action MyEvent;

    MyUserControl MyControl = new MyUserControl(this);
    private void Button_Click(object sender, EventArgs e)
    {
        if(simpleEvent != null) simpleEvent();
    }    
}

public Class MyUserControl : UserControl
{
    //listen for MyEvent from MainForm, and perform MyMethod
    public MyUserControl(MainForm form) {
        simpleEvent += () => MyMethod();
    }

    public void MyMethod()
    {
         //Do Stuff here
    }
}

答案 1 :(得分:2)

这是如何委托私人成员的事件,所以外面的人可以听取它。

public event EventHandlerType EventHandlerName
{
    add
    {
        this._privateControl.EventHandlerName += value;
    }
    remove
    {
        this._privateControl.EventHandlerName -= value;            
    }
}

另一种选择是在表单类中包含一个事件:

public event EventHandler MyEvent;

听取私人成员的事件:

this._customControl.SomeEvent += this.SomeEventHandler;

有了这个:

private void SomeEventHandler(object sender, EventArgs e)
{
    if (this.MyEvent != null)
    {
        this.MyEvent(this, e);
    }
}

两种情况下外部使用都是一样的:

var form = new Form1();

form1.MyEvent += (o, e) => { Console.WriteLine("Event called!"); };

最重要的是你必须在表单中实现功能,以允许外部订阅/监听内部事件。

答案 2 :(得分:1)

//listen for MyEvent from MainForm, and perform MyMethod

这是错误的方式。在控制中发布事件很有用,控件无法猜测它将如何被使用。但是,它肯定应该知道任何可能会或可能不会以其被删除的形式提供的事件。当形式没有(还)有事件时,这有一种讨厌的习惯。糟糕的是,在设计时崩溃,会出现白色的Darn屏幕,并阻止你解决问题。

表单不必猜测,它知道完全它控制了什么。因此,您可能希望在表单中引发事件,只需直接调用控件的MyMethod方法即可。如果出于某种原因这是错误的,比如删除控件而不是调用,那么你只会得到一个易于修复的编译错误。