2012-05-12 24 views
2

我无法弄清楚如何做到这一点,继承人示例代码。我想做什么。C#,如何创建一个事件并在另一个类中侦听它?

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

使该事件公开,或在其他情况下,委托给你的事件。 – SimpleVar

+0

你的意思是在按钮Click事件中调用'MyControl.MyMethod()'? –

+0

我知道我可以调用MyControl.Method(),但是, 我试图理解,如何提出事件并听取它。 – theIrishUser

回答

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

来自ou的用法tside在这两种情况下是相同的:

var form = new Form1(); 

form1.MyEvent += (o, e) => { Console.WriteLine("Event called!"); }; 

底线是你的表格里面,你必须实现的功能,允许外部订阅/听的内部事件。

1
//listen for MyEvent from MainForm, and perform MyMethod 

这是周围的错误的方式。在控件中发布事件很有用,控件无法猜测它将如何使用。然而,它肯定应该而不是知道任何事件可能会或可能不会被放弃的形式。当表单没有(还没有)事件发生时,这具有令人厌恶的习惯。糟糕的是,在设计时发生崩溃,导致了Darn的白屏,并阻止您解决问题。

表单不需要猜测,它知道究竟是它控制的是什么。因此,无论您想要提升事件的形式,只需直接调用控件的MyMethod方法即可。如果由于某种原因导致错误,比如移除控件而不是调用,那么你只是得到一个很容易修复的编译错误。

+0

感谢信息汉斯 – theIrishUser

相关问题