2010-12-14 81 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在任何情況下都會被觸發。