WinForm事件订阅另一个类
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#中订阅其他类的事件?
这是因为您在调用test之前创建了一个新的EventThrower。
如果你改变:
var eventThrower = new EventThrower(); eventThrower.test();
至:
_Thrower.test();
它会调用DoSomething。
事件不是静态的, EventThrower
每个实例都存在一个EventHandler
实例 。
您在_Thrower
上订阅了该事件,但您创建了一个新的EventThrower
实例并在该实例上调用test()
。 您从未在该实例上订阅该事件,因此您的处理程序无法运行。
它应该是:
_Thrower.ThrowEvent += (sender2, args) => { DoSomething(); }; _Thrower.test();