3

這是一個驚人的噩夢,我迫切需要幫助。我已經到處尋找幫助NOTHING已經作爲一個永久性修復。Winform自定義控件 - 設計器隨機停止初始化/調用構造函數

我已經開發了一些自定義控件;控制,擴展按鈕,用戶控制等我有一個問題,VS2010不斷地,隨機的,沒有押韻或我可以辨別的原因,決定當我嘗試打開使用自定義控件的控件的設計視圖,它(編輯:'它是Windows窗體生成器')應完全刪除從.designer.cs文件調用自定義控件的構造函數的LINE,從而完全打破了我查看Design View的能力。該應用程序仍然構建並運行得很好。

我測試過,並排除以下的問題:

  1. 公共構造 - 顯然具有非公開(內部等)構造函數會導致這樣的問題。我檢查了100次 - 所有的自定義控件都有公共構造函數。

  2. 空的構造函數 - 除了公開之外,它必須是空的。

  3. 不調用任何可能在構造函數中失敗的東西 - 我減少了定製控件的所有構造函數以調用

    Name() { }
    調用。那裏沒有運氣。

  4. 命名空間 - 顯然是在不同的命名空間可能會導致問題?我在同一個,並且這些文件是在同一個項目。

  5. 卸載項目。關閉VS.刪除.suo智能感知文件。刪除obj文件。打開VS.重新加載項目。重建項目。仍然沒有運氣。

這是INSANELY令人沮喪。我已經準備好使用自定義控件和單獨的皮膚控制來避免它。任何人都知道是什麼原因造成的?

+0

一些可能無用的想法:你是否安裝了最新的VS2010服務包?你的空的公共構造函數調用:base()(不知道這是否必要)。如果您創建一個全新的空白UserControl,會發生這種情況嗎? – AndrewS 2012-04-29 06:57:35

+0

您需要查找可能被診斷吞下的異常。啓動VS的另一個實例並使用工具+附加到進程以附加到第一個。調試+異常,勾選拋出框爲CLR異常。回到第一個實例並開始設計。 – 2012-04-29 09:12:42

+0

並仔細檢查你的SO用戶名如何影響你的代碼。 – 2012-04-29 09:13:39

回答

3

首先,問題是......你正在把東西放在「.designer.cs」代碼中......不要。這是微軟的沙箱。當創建的WinForms窗體和可視控件,它們通常在一個「設置」,如

MyForm.cs (place for YOUR code) 
    MyForm.designer.cs (Microsoft's sandbox area for designer stuff) 
    MyForm.resx (Resource file -- if used, specific to this form). 

這就是說,如果你通過正常的「設計師」打開你的WinForm,並用鼠標右鍵單擊「查看代碼」,它會調出MyForm.cs代碼集。注意它的一個

PARTIAL PUBLIC CLASS MyForm : Window 
{ 
    public MyForm() 
    { 
     InitializeComponent(); 
    } 
} 

「MyForm.Designer.cs」和「MyForm.cs」基本上作爲一個團隊工作。你的東西除了微軟的東西。根據你正在嘗試做什麼,你可以在這裏把它掛在這個構造函數的整個表單中。如果您需要準備一些數據連接,查詢數據,填充列表或任何將在表單中使用的內容。你可以用很多方式做(無論是之前還是之後)。

public MyForm() 
    { 
     DoYourStuff(); 
     InitializeComponent(); 
     // or DoYourStuff here after designer controls are all initialized. 
    } 

    private void DoYourStuff() 
    { put it here } 

有時你可能想加載整個表單後做的事情,但最終呈現給用戶之前。有時候,我在LOADED完成整個表單(表單和所有它的控件)之後實際上已經掛鉤了。所以我做一樣的東西:

public MyForm() 
{ 

    Load += MyAfterInitializeComponents; 
    InitializeComponent(); 
} 


private void MyAfterInitializeComponents(object sender, EventArgs e) 
{ 
    DoYourStuff(); 
} 

如果有一些具體的事情你正在嘗試做的,也許一些示例代碼,以幫助您的基於窗口的代碼沙箱中集成。

+0

正如我在我的問題中所說的,我*不*修改.designer.cs文件 - designer.cs文件正在修改ITSELF不調用我的自定義控件的構造函數,使控件不可顯示。 我會測試你的解決方案在我的代碼 - 事實證明我遇到的問題是一個覆蓋OnLoad函數,它有一個導致問題的DoStuff() - 我以爲OnLoad只發生在運行時; (!DesignMode)的解決方案是把DoStuff放在裏面。添加到Load的函數只能被調用!DesignMode? – trycatch 2012-04-30 18:06:29

+0

@trycatch ...你現在好嗎?你的評論有點不清楚。我使用+ =一個事件處理程序的鉤子來執行正常的IN ADDITION到我想要運行的+ =鉤子(按照我的示例)。 – DRapp 2012-04-30 18:09:53

+0

我目前正在使用if(!DesignMode)來圍繞我的代碼崩潰;這工作,但感覺馬虎。所以我肯定會在稍後嘗試給你的Load + = Foo()。我正在使用override OnLoad(),顯然當你這樣做並在設計視圖中打開表單時,OnLoad被調用。我將不得不測試Load + =是否不在DesignMode中執行。 – trycatch 2012-04-30 18:41:01