【问题标题】:Control creation in .designer.cs.designer.cs 中的控件创建
【发布时间】: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 方法上方包含一条消息。
  • 发布ParentChangedFindForm 的代码,以便我们调查。
  • 您不需要 FindForm。 UserControls 有一个 ParentForm 属性。让它依赖于表单上的其他控件是一个设计缺陷。

标签: c# forms winforms visual-studio-2017


【解决方案1】:

因此,虽然这可能对您有用一段时间,但核心问题在于每个 Designer.cs 文件中包含的方便消息。

  /// <summary>
  /// Required method for Designer support - do not modify
  /// the contents of this method with the code editor.
  /// </summary>

实际上,此消息应该真正适用于 Designer.cs 文件中的任何内容。我会温和地建议您仔细检查您的代码以及为什么要这样做,并尽快更改它以不依赖 Designer.cs 文件修改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 2011-02-26
    • 2012-12-18
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多