gpt4 book ai didi

C# 事件分发

转载 作者:太空宇宙 更新时间:2023-11-03 23:16:31 25 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

恕我直言,你理解错了

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

这也适用于您的问题:

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

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

编辑:

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

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

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

过滤示例(我可能在最后漏掉了一个转换):

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

关于C# 事件分发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37115978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com