【发布时间】:2018-03-09 08:32:47
【问题描述】:
我们的应用程序中有一些用户控件,它们引用他们所在的表单来获取一些初始化值。根据他们所处的形式,需要不同的行为。
因此,用户控件捕获 OnLoad 和 ParentChanged 事件,并且您 FindForm 可以访问他们所在的表单...并且几年来一切都很好。
但是,上周我们开始遇到一些控件未正确初始化的问题,经过大量搜索后,我可以看到发生的情况是,如果控件位于容器上而不是直接位于表单上,那么当 ParentChanged控件触发的事件,可能是容器尚未添加到表单中,因此 FindForm 不起作用。
奇怪的是,这才刚刚开始发生,而且似乎自从我们升级到最新的 VS 后,当一个表单在编辑后保存时,设计人员正在大量更改创建控件的顺序,有时这导致失败。
有谁知道 VS 设计师的行为是否/为什么发生了变化?另外,是否有任何方法可以控制设计器文件中表单控件的创建顺序?
我可以手动编辑设计器文件进行修复,但在重新保存时,VS 会再次将其恢复原状。
【问题讨论】:
-
依赖 VS 工具或运行时对自动生成的文件所做的任何事情总是有风险的。不管答案是什么,如果它再次改变怎么办?您能否将对父表单相关代码的调用重新定位到生命周期的后期阶段,如 form_load?可以像 foreach 控件一样简单... control.visitparent(this)...
-
...Designer.cs的第一行说:“对此文件的更改可能会导致不正确的行为,并且如果重新生成代码将会丢失。”您需要重新考虑您的设计。 -
@Xiaoy312 不一定;我下面的答案实际上是刚刚生成的,并且只在 InitializeComponent 方法上方包含一条消息。
-
发布
ParentChanged和FindForm的代码,以便我们调查。 -
您不需要 FindForm。 UserControls 有一个 ParentForm 属性。让它依赖于表单上的其他控件是一个设计缺陷。
标签: c# forms winforms visual-studio-2017