[英]C#, How to create an event and listen for it in another class?
我不知道如何执行此操作,这是示例代码。 我想做的。
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
那是错误的方法。 在控件中发布事件非常有用,该控件无法猜测如何使用它。 但是,由于它肯定不应该知道这些可能或不可能的,因为它被丢弃的形式提供的事件东西。 这有一个讨厌的习惯,那就是当表单还没有发生事件时就炸毁它。 同样不好的一种,是设计时发生的崩溃,使“达恩白屏”(White Screen of Darn)停滞不前,无法解决问题。
表单不必猜测,它确切知道它拥有什么控件。 因此,无论您希望在表单中的哪个位置引发事件,只需直接调用控件的MyMethod方法。 如果由于某种原因(例如删除控件而不是调用)而错了,那么您只会得到易于修复的编译错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.