C# Windows窗体设计器中的设计时错误

C# Windows窗体设计器中的设计时错误,c#,.net,winforms,visual-studio-2010,C#,.net,Winforms,Visual Studio 2010,我在同一命名空间上有以下类: public partial class BaseForm : Form { bool isNew = false; public BaseForm() {} public BaseForm(bool isNew) { InitializeComponent(); this.isNew = isNew; } . . . } public partial c

我在同一命名空间上有以下类:

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窗体的设计窗格


这是什么意思?如何使“BitSetForm”win表单的设计窗格再次显示?

您需要向
基本表单添加一个无参数构造函数

它甚至可以是私有的;它只需要存在

如果没有一个实例,设计器将无法创建要在设计图面中显示的BaseForm实例


记住在构造函数中调用InitializeComponent

  • 在设计器实例化基类之前,您需要构建应用程序。如果您的子类表单有一系列错误,这可能非常困难
  • 设计器只能实例化具有默认无参数构造函数的类。这意味着您的基类的基形式(bool isNew)永远不会被设计器调用。这意味着InitializeComponent也不会。您应该将InitializeComponent移动到无参数构造函数,并让第二个构造函数调用第一个构造函数
  • 默认情况下,InitializeComponent是私有的。您不应该将其可见性更改为protected,因为它是私有的,所以不需要
    new
    修改器
  • InitializeComponent不应该以这种方式链接到基类。它只能由构造函数调用
  • 考虑到所有这些问题,我强烈建议您要么放弃Windows窗体继承,要么至少将基类移动到单独的程序集中。我已经试过很多次了,但这太麻烦了


    需要记住的关键是,当您在设计器中查看表单时,设计器并不是在创建您看到的表单的实例,而是在创建基类的实例。在运行时,情况显然不是这样。因此,经常会看到不同的运行时/设计时行为。

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

    public partial class BaseForm : Form 
    {         
        bool isNew = false;      
    
        public BaseForm() 
        { 
            InitializeComponent(); 
        }
    
        public BaseForm(bool isNew) : this()
        {        
    
            this.isNew = isNew;
        }
    }  
    
    因此,如果您希望在BaseForm定义中执行其他内容,而不考虑参数化启动,那么也会调用这些内容。这样,无论哪种情况下都会触发InitializeComponent。

    第一项“需要构建应用程序”帮助了我,谢谢!