2010-09-28 132 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