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

本文关键字:另一个 事件 何创建 创建 一个 | 更新日期: 2023-09-27 18:33:55

我不知道如何做到这一点,这是示例代码。我想做的。

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
    }
}

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

步骤 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
    }
}

这是委派给私人成员的活动的方法,以便外部可以收听它。

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!"); };

底线是您必须在表单中实现功能,以允许外部订阅/侦听内部事件。

//listen for MyEvent from MainForm, and perform MyMethod

这是错误的方式。 在控件中发布事件很有用,控件不可能猜测它将如何使用。 然而,它肯定不应该知道一个事件的任何信息,这些事件可能以它被丢弃的形式提供,也可能不可用。 这有一个令人讨厌的习惯,当形式(尚未)有事件时爆炸。 也是糟糕的那种,在设计时崩溃,它会打开 Darn 的白屏并阻止您解决问题。

表单不必猜测,它确切地知道它有什么控件。 因此,在窗体中您可能想要引发事件的位置,只需直接调用控件的 MyMethod 方法即可。 如果由于某种原因这是错误的,例如删除控件而不是调用,那么您只会得到一个易于修复的编译错误。