如何在课程之间传递事件?
我知道这听起来很荒谬(而且确实如此),但在过去的一段时间里我一直被这件事难住了。搜索没有出现类似的问题,所以我想我会提出它。
以下是涉及的对象:
WinForm -> Speaker -> Tweeter
-> Woofer
[Speaker, Tweeter, Woofer] 都声明了一个发送简单字符串消息的“SpeakToMe”事件。事件使用标准模式声明:
public delegate void SpeakToMeHandler(object sender, SpeakToMeEventArgs e);
public event SpeakToMeHandler SpeakToMe;
protected virtual void OnSpeakToMe(string message)
{
if (SpeakToMe != null) SpeakToMe(this, new SpeakToMeEventArgs(DateTime.Now.ToString() + " - " + message));
}
SpeakToMeEventArgs 是一个简单的类,继承自 EventArgs 并包含一个字符串属性(消息)。
就其本身而言,这些事件中的每一个都可以正常工作。例如,我在表单中设置了一个按钮来创建、订阅和触发 [Speaker, Tweeter, Woofer] 的事件。每个报告都正确返回。
问题是当 Speaker 创建一个 [Tweeter, Woofer] 并订阅他们的事件时。
我想要的是 [Tweeter, Woofer] 触发他们的事件,扬声器消耗它并触发它自己的事件。我认为这应该非常简单:
void tweeter_SpeakToMe(object sender, SpeakToMeEventArgs e)
{
Console.Out.WriteLine("the tweeter is speaking: " + e.Message);
this.OnSpeakToMe("tweeter rockin' out [" + e.Message + "]");
}
单步执行此功能(在扬声器中),Console.Out.WriteLine 工作。继续单步执行 OnSpeakToMe,显示委托为空。
发言人的 SpeakToMe 事件由表单订阅。我知道这应该防止事件的委托为空。
我确定这很容易,我错过了什么?
顺便说一句,如果你好奇我为什么要找这个。[Speaker, Tweeter, Woofer] 是我的演示替身,用于非常长的数据处理操作。该表单同时运行其中的几个,并且需要每个班级的进度更新。
一如既往,非常感谢任何和所有帮助!
更新:感谢大家的所有反馈。我真的很感激帮助!我收集了一些很好的技巧(@David Basarab 和@Brian)以及一些关于如何构建事物的不同想法。再次,非常感谢!