繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM