2010-09-28 156 views
0

我有一個3窗口的示例窗體。每個窗口都有一個標籤,主窗體有一個按鈕。Windows窗體事件訂閱c#

我有下面的代碼類:

public class CustomEventArgs : EventArgs 
{ 
    public string Message { get; set; } 
    public CustomEventArgs(string message) 
    { 
     Message = message; 
    } 
} 

public delegate void CustomEventHandler(object sender, CustomEventArgs args); 

public class EventCode 
{ 
    public void Process() 
    { 
     var cea = new CustomEventArgs("I was processed"); 
     if (MyEvent != null) 
     { 
      MyEvent.Invoke(this, cea); 
     } 
    } 

    public event CustomEventHandler MyEvent; 
} 

在我的主要形式,我要按下按鈕,有它在我的EVENTCODE類過程代碼,然後調用事件。我希望事件向兩個已打開的表單發送一條消息,然後在屏幕上顯示一條消息。

這裏是在Form1中我按一下按鈕代碼:

 private void Form1_Load(object sender, EventArgs e) 
    { 
     Window1 w1 = new Window1(); 
     w1.Show(); 

     Window2 w2 = new Window2(); 
     w2.Show(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     EventCode ec = new EventCode(); 
     ec.Process(); 
    } 

在窗口1:

EventCode ec = new EventCode(); 
    public Window1() 
    { 
     InitializeComponent(); 
     ec.MyEvent += new CustomEventHandler(ec_MyEvent); 
    } 

    void ec_MyEvent(object sender, CustomEventArgs args) 
    { 
     label1.Text = args.Message; 
    } 

重複窗口2

當我點擊該按鈕,事件訂閱呢不要在每個表單上顯示文字。如果我在主窗體上創建事件訂閱,它將顯示。

我不確定採取哪條路線才能使此功能正常工作。

想法?

+0

@SLaks,這不是真的......'.Invoke'是隱含的,省略它會導致完全相同的IL。也許你對「DynamicInvoke」感到困惑,它確實慢得多。 – 2010-09-28 22:18:55

回答

2

訂閱事件僅適用於您訂閱的實例。如果您創建EventCode的新實例並訂閱事件,則只有在您針對該特定實例調用Process時纔會引發該事件。

快速解決方案:將您在主窗口中創建的EventCode實例傳遞給兩個子窗口。

public Window1(EventCode eventCode) 
{ 
    InitializeComponent(); 
    eventCode.MyEvent += new CustomEventHandler(ec_MyEvent); 
} 

void ec_MyEvent(object sender, CustomEventArgs args) 
{ 
    label1.Text = args.Message; 
} 
+0

有道理。謝謝,這工作完美。 – CodeLikeBeaker 2010-09-29 12:54:46