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

C#,如何创建一个事件并在另一个类中侦听它?,c#,winforms,C#,Winforms,我不知道怎么做,这里是示例代码。我想做的事 public Class MainForm : Form { MyUserControl MyControl = new MyUserControl; private void Button_Click(object sender, EventArgs e) { //Create MyEvent } } public Class MyUserControl : UserControl {

我不知道怎么做,这里是示例代码。我想做的事

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

这是如何委托给私有成员的事件,以便外部可以听到它

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!"); };
底线是您必须在表单内部实现功能,以允许外部订阅/侦听内部事件。

步骤1)在MainForm上公开事件。。。说

public event Action simpleEvent
步骤2)为MyUserControl提供一个构造函数,该构造函数接受MainForm实例并将操作绑定到该事件

public MyUserControl(MainForm form) {
    form += () => Console.WriteLine("We're doing something!")
}
步骤3)在MainForm中引发事件。按钮\u单击

if(simpleEvent != null) simpleEvent();
注意:您可以注册自己的委托并使用lambda表达式以外的其他内容。有关更详细的解释,请参阅

你的最终结果看起来像

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
    }
}
这是错误的做法。在控件中发布事件很有用,但是控件不可能猜测它将如何使用。然而,它肯定不应该知道任何关于事件的信息,这些信息可能以它被丢弃的形式存在,也可能不存在。它有一个坏习惯,就是当表单还没有事件发生时,它就会爆炸。坏的一种也是,在设计阶段出现的一次崩溃,造成了Darn的白色屏幕,阻止了您解决问题


表单不必猜测,它确切地知道它有什么控件。因此,如果您希望以某种形式引发事件,只需直接调用控件的MyMethod。如果出于某种原因,比如移除控件而不是调用,那么你只会得到一个易于修复的编译错误。

将事件公开,或者在其他情况下,委托给你的事件。你是说在按钮单击事件中调用
MyControl.MyMethod()
?我知道我可以调用MyControl.Method(),但是,我正在努力理解,如何提出一个事件并倾听它。
//listen for MyEvent from MainForm, and perform MyMethod