【问题标题】:Design-Time Errors in the Windows Forms DesignerWindows 窗体设计器中的设计时错误
【发布时间】:2011-05-25 01:44:20
【问题描述】:

我在同一个命名空间上有这些类:

public partial class BaseForm : Form
{    
    bool isNew = false;

    public BaseForm() {}


    public BaseForm(bool isNew)
    {
       InitializeComponent();

       this.isNew = isNew;
    }
    .
    .
    . 
}

public partial class BitSetForm : BaseForm
{

    public BitSetForm(bool isNew) : base(isNew)
    {
        InitializeComponent();           
    }

    new private void InitializeComponent()
    {
        .
        .
        .
    }
}

1) 我收到此警告:找不到类型“..BaseForm”,请确保引用了包含此类型的程序集。如果此类型是您的开发项目的一部分,请确保已使用当前平台或任何 CPU 的设置成功构建项目。

2) Windows 窗体设计器中的设计时错误出现并隐藏“BitSetForm”win-form 的设计窗格。

这是什么意思?如何让“BitSetForm”win-form的设计面板重新显示?

【问题讨论】:

    标签: c# .net winforms visual-studio-2010


    【解决方案1】:

    您需要向您的BaseForm 添加一个无参数构造函数。
    甚至可以是private;它只需要存在。

    如果没有,设计者无法创建 BaseForm 的实例以显示在设计图面上。

    记得在构造函数中调用InitializeComponent

    【讨论】:

      【解决方案2】:

      有几件事...

      1. 您需要先构建应用程序,然后设计器才能实例化您的基类。如果您的子类表单有一堆错误,这可能会非常困难。
      2. 设计者只能实例化具有默认无参数构造函数的类。所以这意味着你的基类的 BaseForm(bool isNew) 永远不会被设计者调用。这意味着 InitializeComponent 也不会。您应该将 InitializeComponent 移至无参数构造函数,并让第二个构造函数调用第一个构造函数。
      3. InitializeComponent 默认是私有的。您不应将其可见性更改为受保护,因为它是私有的,所以不需要 new 修饰符。
      4. InitializeComponent 永远不应以这种方式链接到基类。它只能由构造函数调用。

      鉴于所有这些问题,我强烈建议您放弃 Windows 窗体继承,或者至少将您的基类移动到单独的程序集中。我试过很多次了,麻烦多于它的价值。

      要记住的关键是,当您在设计器中查看表单时,设计器并不是在创建您所看到的表单的实例,而是在创建基类的实例。在运行时显然不是这样。所以看到不同的运行时/设计时行为是很常见的。

      【讨论】:

      • 第一项“需要构建你的应用程序”帮助了我,谢谢!
      【解决方案3】:

      正如@SLaks 所述,您需要在类的构造函数中使用 InitializeComponent。我实际上会在无参数实例中使用它。然后,在你的布尔构造函数中,我将更改为

      public partial class BaseForm : Form 
      {         
          bool isNew = false;      
      
          public BaseForm() 
          { 
              InitializeComponent(); 
          }
      
          public BaseForm(bool isNew) : this()
          {        
      
              this.isNew = isNew;
          }
      }  
      

      因此,如果您希望在 BaseForm 定义中执行其他操作,而不管参数化启动如何,也会调用它。这样,InitializeComponent 在任何一种情况下都会被触发。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        • 2013-05-05
        相关资源
        最近更新 更多