8

我有一個C#應用程序幾種形式。我使用Visual Studio 2010測試版,但.NET 3.5和C#3..NET繼承(的WinForms)表 - VS設計問題

我有一個基本形式,在Shd命名空間中稱爲FilteredQueryViewForm,我希望一些其他形式來繼承它(因爲它們基本上會做同樣的事情,但有一些補充)。

我從私人變化的東西在FilteredQueryViewForm類保護的,所以他們從派生形式訪問。在此之後,我創建了派生表單並將基類設置爲FilteredQueryViewForm。

派生類的設計者抱怨沒有任何構造函數Shd.FilteredQueryViewForm ......不管事實它有一個,有3個參數。我認爲參數可能是一個問題,所以我也創建了一個(公共的,當然)沒有參數的構造函數,但它仍然不起作用。錯誤消息是相同的:

「找不到類型爲'Shd.FilteredQueryViewForm'的構造函數。」

和派生類的設計者將不會加載。 我試過重新啓動vs2010beta,重新創建派生窗體,但似乎沒有任何幫助。 Google在這個問題上對我沒有任何有用的結果。 :(

這是Visual Studio 2010的測試版的問題?還是我做錯了什麼?

回答

19

你需要無參數的構造函數調用它在每一個你的表格的InitializeComponent()方法。 然後關閉設計師窗口,重建解決方案,並嘗試重新打開設計師,這應該工作重建解決方案是必不可少的

問題是,如果您創建一個窗體,從Shd.FilteredQueryViewForm繼承,設計師將嘗試調用父窗體的構造函數,但它不是從代碼加載此窗體,而是從它的內置裝配中加載此窗體。

+0

謝謝,重建解決方案是我錯過的一步。 – ShdNx 2009-08-01 16:43:34

0

我想你的意思是你的Form1.cs [設計]沒有更新,當你添加你的基類。我有同樣的問題。奇怪的是,當你按下開始時,程序運行得很好,當你運行它時,你會在你的Form上看到你的基類組件,但是當你處於編輯模式時,你不會看到你的基類組件。在解決方案資源管理

只需雙擊Form1.cs中。它爲我工作。 Do this

1

我知道這是一個老話題,但這些事情再次發生,所以我認爲我的貢獻可能在未來有用。

Emiswelt說:「你需要無參數的構造函數調用它在每一個你的表格的InitializeComponent()方法。」 這不是真的需要。 您可以在派生窗體上聲明一個自定義參數化構造函數,並通常調用「InitializeComponent」方法(也可以調用自定義構造函數)。重要的是您的構造函數調用「InitializeComponent」(用於新控件)和基礎構造函數調用「InitializeComponent」(用於繼承組件)。 這種情況在運行時會起作用,但您不會在Visual Studio設計器上看到繼承的控件。 要在設計時顯示所有控件,只能在基類中添加一個不帶參數的簡單構造函數。

例如,如果你的基地是一個按鍵,兩個單選按鈕的形式:沒有問題

using System.Windows.Forms; 
namespace Test 
{ 
    public partial class Form1 : Form 
    { 
     public Form1(string foo) 
     { 
      //use "foo" here 
      InitializeComponent(); //here button and radios will be initialized 
     } 
    } 
} 

你可以看到它的設計工具,可避免空白的構造函數(不帶參數) 。 該窗體2現在是從Form1中繼承:

namespace Test 
{ 
    public partial class Form2 : Form1 
    { 
     public Form2(string foo) : base(foo) 
     { 
      //you can use "foo" here even if it is passed to base class too 
      InitializeComponent(); 
     } 
    } 
} 

有沒有空的構造函數,它會編譯並正常運行。在rutime你的Form2將顯示與Form1相同的控制集。 但是......你不能在設計時看到它,因爲Visual Studio無法識別「InitializeComponent」方法的位置並顯示錯誤。 爲什麼?因爲在調用鏈上應該有一個沒有參數的構造函數。 該解決方案是對基類的簡單修改:

using System.Windows.Forms; 

namespace Test 
{ 
    public partial class Form1 : Form 
    { 
     public Form1(string foo):base() 
     { 
      //use foo here 
     } 

     public Form1()   //Visual studio designer likes this! 
     { 
      InitializeComponent(); 
     } 
    } 
} 

就是這樣。