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

时间:2010-12-14 04:46:52

标签: 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 class BitSetForm : BaseForm
{

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

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

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

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

这是什么意思?我该怎么做才能再次显示“BitSetForm”win-form显示的设计窗格?

3 个答案:

答案 0 :(得分:5)

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

如果没有,设计人员无法创建要在设计图面中显示的BaseForm实例。

请记得在构造函数中调用InitializeComponent

答案 1 :(得分:2)

好几件事......

  1. 您需要在设计人员实例化基类之前构建应用程序。如果您的子类表单有一堆错误,这可能非常困难。
  2. 设计器只能实例化一个具有默认无参数构造函数的类。这意味着设计师永远不会调用你的基类的BaseForm(bool isNew)。这意味着InitializeComponent也不会。您应该将InitializeComponent移动到无参数构造函数,并让第二个构造函数调用第一个。
  3. 默认情况下,InitializeComponent是私有的。您不应将其可见性更改为受保护且由于它是私有的,因此不需要new修饰符。
  4. 不应该将InitializeComponent链接到基类。它应该只由构造函数调用。
  5. 鉴于所有这些问题,我强烈建议放弃Windows窗体继承或至少将基类移动到单独的程序集中。我已经尝试了很多次,这比它的价值更麻烦。

    要记住的关键是,当您在设计器中查看表单时,设计人员不会创建您看到的表单实例 - 它正在创建基类的实例。在运行时,显然不是这种情况。因此,看到不同的运行时/设计时行为是很常见的。

答案 2 :(得分:2)

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

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

    public BaseForm() 
    { 
        InitializeComponent(); 
    }

    public BaseForm(bool isNew) : this()
    {        

        this.isNew = isNew;
    }
}  

因此,如果您想要在BaseForm定义中执行其他任何内容而不管参数化启动,那么也会调用它。这样,InitializeComponent在EITHER情况下被触发。