WinForm事件订阅另一个类

时间:2011-11-30 23:41:49

标签: c# winforms

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永远不会发射。

How to subscribe to other class' events in c#?

2 个答案:

答案 0 :(得分:1)

该事件不是静态的,EventHandler的一个实例存在于 EventThrower的每个实例中。

您在_Thrower订阅了该活动,但您创建了EventThrower的新实例,并在该实例上调用了test()。您从未在该实例上订阅该事件,因此您的处理程序无法运行。

应该是:

_Thrower.ThrowEvent += (sender2, args) => { DoSomething(); };
_Thrower.test();

答案 1 :(得分:0)

这是因为您在调用test之前创建了一个新的EventThrower。

如果你改变:

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

为:

    _Thrower.test();

它会调用DoSomething。