【问题标题】:Why does VS2017 keep losing my derived controls?为什么VS2017总是丢失我的派生控件?
【发布时间】:2018-11-01 11:52:59
【问题描述】:

在我的应用程序namespace = DRT 中,我正在创建从相应的 Windows 控件类派生的控件类(例如按钮、文本框),例如

internal abstract class DRT_Button_Abstract : Button
{
    ....
}

internal class DRT_Button_CancelSearch : DRT_Button_Abstract
{
    ....
}

internal class DRT_Button_StartSearch : DRT_Button_Abstract
{
    ....
}

我目前共有 13 个派生类,它们派生自我的一个摘要或 Windows 控件类。成功构建后,我在工具箱上看到了我的控件类(例如,DRT_Button_CancelSearchDRT_Button_StartSearch),我成功地将它们放到了我的主窗体上。暂时一切都很好,但最终,我将打开主 form.cs [Design](即 UI 设计器),它会显示错误 The variable '{control property name}' is either undeclared or was never assigned. 用于我的某些控件组合。

当我检查主窗体 Designer.cs 文件时,除了预期的 new 语句外,所有控件的预期代码都存在。它们不存在于主窗体 Designer.cs 文件中。例如,我希望看到 this.drt_Button_CancelSearch = new DRT.DRT_Button_CancelSearch(); 但它不见了

我已经尝试忽略错误,进入 UI 设计器窗口以重新应用丢失的控件,但问题只是在新应用的控件上重复

这到底是怎么回事?有没有办法从这种情况中恢复过来?

【问题讨论】:

  • 所有派生控件都有默认构造函数吗?您是否尝试将它们标记为public 而不是internal
  • @RonBeyer:对于默认构造函数:如果我理解正确,我想我错过了一些。对于我的每个抽象类和每个派生类,我在类的构造函数定义中添加了: base(),例如public DRT_Button_Abstract(): base()public DRT_Button_CancelSearch() : base()。正确的?还将全部设置为public 并重试

标签: c# winforms visual-studio inheritance controls


【解决方案1】:

这很可能是设计器无法清除/重新加载其缓存的问题。你无能为力。过去我:

  • 关闭并重新打开所有具有用户控件的设计器
  • 将所有控件放在一个单独的项目中(在同一个解决方案中)
  • 将所有控件放在单独的解决方案/Visual Studio 实例中,并设置对控件的 dll(甚至是 nuget 包)的正确引用

通过前两个选项,我取得了不同程度的成功。重新打开设计器不是很方便,也不行。

最后一个选项是最好的,但也是最烦人的,因为每次调整都需要重建项目并更新参考/包。

还要确保您创建的所有控件都具有公共默认构造函数,并且在使用此构造函数时能够正常运行。

【讨论】:

  • 我接受这个答案是因为 Erno 和 Ron 都调用了公共构造函数,但 Ron 的 Do all of your derived controls have default constructors 也迫使我找出我的某些类是如何丢失的 : base()。无论如何,确保我的所有课程(包括摘要)都有: base() 并将它们标记为公开似乎已经解决了我的问题
猜你喜欢
  • 2011-09-15
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多