代码之家  ›  专栏  ›  技术社区  ›  CodeLikeBeaker

Windows窗体事件订阅c#

  •  0
  • CodeLikeBeaker  · 技术社区  · 16 年前

    我有一个带3个窗口的示例窗体。每个窗口都有一个标签,主窗体有一个按钮。

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

    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重复

    当我单击按钮时,事件订阅不会在每个窗体上显示文本。如果我在主窗体上创建事件订阅,它将显示。

    我不知道该走哪条路来实现这个功能。

    思想?

    1 回复  |  直到 16 年前
        1
  •  2
  •   JDT    16 年前

    对事件的订阅仅适用于您订阅的实例。如果创建EventCode的新实例并订阅事件,则只有在对该特定实例调用Process时才会引发该事件。

    public Window1(EventCode eventCode)
    {
        InitializeComponent();
        eventCode.MyEvent += new CustomEventHandler(ec_MyEvent);
    }
    
    void ec_MyEvent(object sender, CustomEventArgs args)
    {
        label1.Text = args.Message;
    }