【问题标题】:C# event distributionC# 事件分发
【发布时间】:2016-05-09 20:51:12
【问题描述】:

我有一个带有模块化/可停靠子表单的 WinForm (WeifenLuo)。在表单之间传递事件/信息的最佳做法是什么?

例如:我希望 SubForm1 中的“SelectionChanged”事件更改 SubForm2 中突出显示的内容。问题是,可能有零个 SubForm2-Tab,一个或多个实例。

目前,如果用户请求一个新的 SubForm 实例,则会调用这样的函数:

    private void toolStripMenuItemSubForm1_Click(object sender, EventArgs e)
    {
        SubForm1 subForm1 = new SubForm1();
        subForm1.Show(dockPanelMain, DockState.Document);
    }

主窗体没有记录除dockPanelMain.Contents之外的所有子窗体。

编辑:我知道表单如何相互交互以及事件本身如何工作。我的问题是来自 SubForm1 的事件可以改变不同的其他 SubForms,但它们可能在给定的时间点不存在,或者可能有多个实例,我不想通过 MainForm 为每个事件链接它。

【问题讨论】:

  • 添加一个事件并发起它。某人(另一种形式)可以订阅/取消订阅它并做一些事情。
  • 这实在是太宽泛了......但这是我的两分钱,全球活动中心怎么样?如果您在创建一个必须接收事件的表单时拥有一个全局集线器,请订阅它,然后必须触发该事件的表单调用集线器来提升它。干净简单。
  • 全球活动中心是我的第一个想法,但起初它似乎有点复杂和臃肿,但到目前为止我唯一的解决方案。
  • @RenéVogt 一开始我也以为是,不过这个问题不一样,不是亲子关系,而是子子不相识的子跨度>

标签: c# winforms events


【解决方案1】:

恕我直言,你搞错了

一位老师曾经这样向我提出过​​这样的问题:“CEO不一定认识为他工作的每个人。但是,每个工人都会知道他是CEO”(请原谅措辞,这是(匆忙)翻译的)

这也适用于您的问题:

将父实例传递给子实例,子实例将负责保存此实例并订阅他们应该监听的事件。

这样,你的父类只需要负责引发事件,子类将完成更新自己的工作

编辑:

要在停靠面板的内容类之间工作,基本上是一样的。

将停靠面板的Contents 属性传递给子类。 由于它是一个集合(因此是一个引用类型),因此子类将始终可以访问该集合的最新“版本”。

您只需通过过滤此集合来获取您感兴趣的所有实例

过滤示例(我可能在最后错过了一个演员表):

IEnumerable<SubForm2> sf2 = dockContents.Where(sf => sf is SubForm2)

【讨论】:

  • 我更多地将其视为一个问题:如果没有 CEO 作为中间人,一名员工如何与其他员工 (0-n) 互动。
  • 我喜欢这个概念。无需额外的课程或分销商。在我的构造函数中添加了一个 foreach-existing-content 循环和一个 dockPanelMain.Contents.ContentAdded 事件。应该可以正常工作,以后可能会有点臃肿。
  • @thetemplar 这只是可能的,因为所有这些实例都属于一个共同的层次结构。如果他们没有,你唯一的解决方案就是古斯曼的一个 AFAIK
【解决方案2】:

我建议将包含事件/委托的 Event 类传递给您的 Subform 构造函数。每个子表单都可以订阅在适当时间引发的事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多