Подписка на события Windows Forms c # - PullRequest
0 голосов
/ 29 сентября 2010

У меня есть образец формы с 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, а затем вызывает событие.Я хочу, чтобы событие отправило сообщение на обе открытые формы, которые затем отобразят сообщение на экране.

Вот мой код нажатия кнопки в Форме1:

        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

Когда я нажимаю на кнопку, подписка на событие не отображает текст на каждой из форм.Если я создаю подписку на событие в главной форме, она будет отображаться.

Я не уверен, какой путь выбрать, чтобы эта функция работала.

Мысли?

1 Ответ

2 голосов
/ 29 сентября 2010

Подписки на события работают только для экземпляров, на которые вы подписаны. Если вы создаете новый экземпляр 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...