3

我无法弄清楚如何做到这一点,这是示例代码。我想做的事。

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

3 回答 3

4

第 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
    }
}
于 2012-05-12T19:18:19.887 回答
2

这是如何委派私人成员的事件,以便外部可以收听它。

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

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

于 2012-05-12T19:17:52.827 回答
1
//listen for MyEvent from MainForm, and perform MyMethod

那是错误的方法。在控件中发布事件很有用,控件不可能猜到它将如何被使用。然而,它当然不应该知道任何关于可能以它被丢弃的形式可用或不可用的事件的任何信息。当表单(还)没有事件时,这有一个令人讨厌的习惯。坏的也是,设计时的崩溃会出现该死的白屏并阻止您解决问题。

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

于 2012-05-12T19:29:17.657 回答