C#事件分发

时间:2016-05-09 12:34:16

标签: c# winforms events

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

例如:我想要一个" SelectionChanged" SubForm1中的事件更改SubForm2中突出显示的内容。问题是,可能没有SubForm2-Tabs,一个或多个实例。

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

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

除了dockPanelMain.Contents之外,MainForm没有所有子表单的记录。

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

2 个答案:

答案 0 :(得分:3)

恕我直言,你以错误的方式采取这种方式

一位老师过去常常以这种方式向我提出这样的问题:"首席执行官并不一定知道每个为他工作的人。但是,每个工人都会知道它的CEO" (原谅措词,它(匆匆)翻译)

这也适用于您的问题:

将父实例传递给将负责保留此实例的子项,并将其归属于他们应该监听的事件。

这样,你的父班只需要照顾好事件,孩子们就会做更新自己的工作

修改

要在dockpanel的内容类之间工作,它基本上是一样的。

将dockpanel的Substeps属性传递给子类。 由于它是一个集合(因此也是一个引用类型),因此子类将始终可以访问最新的版本'该系列。

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

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

Contents

答案 1 :(得分:0)

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