2011-11-30 102 views
0
public partial class Form1 : Form 
{ 
    private EventThrower _Thrower; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void DoSomething() 
    { 
     MessageBox.Show("It worked"); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     _Thrower = new EventThrower(); 
     //using lambda expression..need to use .NET2 so can't use this. 
     _Thrower.ThrowEvent += (sender2, args) => { DoSomething(); }; 

     var eventThrower = new EventThrower(); 
     eventThrower.test(); 
    } 
} 

public class EventThrower 
{ 
    public delegate void EventHandler(object sender, EventArgs args); 
    public event EventHandler ThrowEvent = delegate { }; 

    public void SomethingHappened() 
    { 
     ThrowEvent(this, new EventArgs()); 
    } 

    public void test() 
    { 
     System.Threading.Thread.Sleep(1000); 
     SomethingHappened(); 
    } 
} 

我想让我的winform用户界面订阅EventThrower类中的事件。 DoSomething永远不会发生。WinForm事件订阅到另一个类

How to subscribe to other class' events in c#?

+0

尝试'_Thrower.test();',而不是把另一EventThrower() – CFinck

回答

0

这是因为你在调用测试之前创建一个新的EventThrower。

如果更改:

var eventThrower = new EventThrower(); 
    eventThrower.test(); 

到:

_Thrower.test(); 

它将调用DoSomething的。

+0

跛......我在你面前回答10秒:d –

0

事件不是静态的,EventHandler的一个实例存在每个实例EventThrower

您订阅事件上_Thrower,但你创建的EventThrower一个新的实例,并在调用test()该实例。您从未订阅过该实例的事件,因此您的处理程序无法运行。

它应该是:

_Thrower.ThrowEvent += (sender2, args) => { DoSomething(); }; 
_Thrower.test(); 
+0

感谢所有..都问了一个关于http://stackoverflow.com/questions/8335131/winform-events-in-another-class-net2-simplify-delegate的后续问题,这个问题与.NET2不同,并且试图简化。 –