【问题标题】:Windows forms: Wiring up custom events between controls added at runtimeWindows 窗体:在运行时添加的控件之间连接自定义事件
【发布时间】:2011-08-05 08:01:45
【问题描述】:

如果我有以下表格:
Screenshot here

表单有多个用户控件(橙色),其中还包含多个用户控件(绿色)。

我的问题是:
1)如果我向“橙色”用户控件之一添加额外的“绿色”用户控件,将这个新的“绿色”用户控件连接到主窗体上的按钮事件的最佳方法是什么(没有“橙色”或“绿色”用户控件了解主窗体)?
我想用“绿色”用户控件作为参数从“橙色”用户控件向主窗体触发一个事件,然后在主窗体中处理接线。

2)是否有更好的“地方”来处理这种接线?

3)如果所有“绿色”用户控件都需要连接到彼此的事件(例如,如果其中一个值发生变化,则需要通知所有其他人),最好的方法是什么?我想过创建一个单例类 EventManager 来处理这个问题吗?

我真的在为松散耦合的用户控件组合和连接它们而苦苦挣扎。

我希望我的问题很清楚。

提前致谢, 凯文

【问题讨论】:

  • AVG 告诉我您的 imageshack 链接中有问题。我敢肯定这不是你的错,但是嘿伙计,小心点。误报?

标签: c# winforms events user-interface


【解决方案1】:

这是我的想法,任何控件/类都应该负责配置自身及其直接子级的公共接口。类或控件的用户不应该需要任何关于它的父级的知识或任何关于它的子级的内部知识。

因此,在您的示例中,橙色控件应该订阅绿色控件事件并相应地采取行动,可能会将自己的事件提升到父级,或者可能影响兄弟绿色控件上的某些字段。在橙色控件中添加和删除绿色控件时,橙色控件负责维护其内部“接线”。无论这发生在 Orange 上的公共方法还是私有方法中都是如此,如果主机能够通过 Orange 上的某些公开集合来执行此操作,则执行此操作的逻辑必须封装在 Orange 中。

无论我们考虑橙色、主机、绿色还是任何其他类/控件,这句话都是正确的。

在编码方面,当添加和删除控件时,您需要将 +=-= 与 Multicast Delegate\Event subcriber 模型一起使用。处理程序将被适当地编码。

【讨论】:

  • 所以如果我理解的很好,我应该在绿色和橙色的用户控件中创建一个事件ValueChanged,并让主窗体订阅橙色的ValueChanged事件,让橙色订阅绿色的ValueChanged事件。 一旦绿色的值发生变化,橙色将被通知,然后可以将他的 ValueChanged 事件提升到主窗体?
    一旦发生这种情况,通知其他橙色 cusercontrol 的最佳方法是什么?直接通过公共方法,或者也通过事件。 (在第二种情况下,我应该在哪里接线?将主窗体传递给橙色,以便橙色可以自行接线?)谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多