Подписка на событие WinForm для другого класса - PullRequest
1 голос
/ 01 декабря 2011
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 UI подписаться на событие в классе EventThrower.DoSomething никогда не срабатывает.

Как подписаться на события других классов в c #?

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Событие не является статическим, существует один экземпляр EventHandler для , каждый экземпляр из EventThrower.

Вы подписываетесь на событие на _Thrower, но создаете новый экземпляр EventThrower и вызываете test() на этом экземпляре .Вы никогда не подписывались на событие в этом экземпляре, поэтому ваш обработчик не запускается.

Это должно быть:

_Thrower.ThrowEvent += (sender2, args) => { DoSomething(); };
_Thrower.test();
0 голосов
/ 01 декабря 2011

Это потому, что вы создаете новый EventThrower перед вызовом test.

Если вы измените:

    var eventThrower = new EventThrower();
    eventThrower.test();

до:

    _Thrower.test();

Это вызовет DoSomething.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...