2010-12-14 85 views
2

我有相同的命名空间这一类:设计时错误

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-form显示的设计窗格再次出现?

回答

5

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

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

记得在构造函数中调用InitializeComponent

+0

已经开箱即用,但仍出现此错误 – PUG 2015-12-07 07:03:32

2

那么几件事情...

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

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

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

+0

第一项“需要构建您的应用程序”帮助了我,谢谢! – allquixotic 2013-04-16 21:17:24

2

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

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

    public BaseForm() 
    { 
     InitializeComponent(); 
    } 

    public BaseForm(bool isNew) : this() 
    {   

     this.isNew = isNew; 
    } 
} 

所以,如果你有你想要一个parameerized启动您的基本形式定义范围内进行的,无论其他的东西,这也将被调用。这样,InitializeComponent在任何情况下都会被触发。