2011-11-30 46 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不同,並且試圖簡化。 –