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
}
}
步骤 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 方法即可。 如果由于某种原因这是错误的,例如删除控件而不是调用,那么您只会得到一个易于修复的编译错误。