3

我已經創建了一些控件,從我的Winform應用程序的UserControl繼承。根據需要,它們都有無參數的構造函數。當我將它們拖放到主表單上時,我在設計時在Visual Studio中出現錯誤,無法呈現表單。如何停止Visual Studio在我的UserControl中生成Setter調用?

我發現那是什麼,在表單的Designer.cs文件中,在我的控制被實例化時,IDE被放置網上有調用我的制定者之一。 BlockKey = 0。那麼,setter背後的代碼正在調用其他代碼,並且很快就會拋出NullReferenceException,因爲表單沒有運行;其他代碼不準備在這一點上產生任何東西。

如果我手動刪除二傳手線,錯誤消失。但是關閉並重新打開,或者重新編譯,IDE會重新打開這條線。我嘗試着在UserControl內部裝飾[DefaultValue(false)]的裝飾器,認爲這樣可以抑制對setter的設計時調用,但是它沒有。

如何才能擺脫在設計這一行的?或者我希望在代碼中寫入一些預防性代碼?

回答

3

您應該使用DesignerSerializationVisibilityAttribute屬性你的財產將其設置爲Hidden

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
public int BlockKey 
{ 
    get { return 0; } 
    set { /* Do something */ } 
} 

另外,如果您需要更具體的邏輯(即只在一定的條件下序列化),那麼你必須創建一個返回一個布爾值,並在bool ShouldSerialize*PropertyName*()

bool ShouldSerializeBlockKey() 
{ 
    return false; 
} 

格式具有特定名稱的函數(注:我忘了這個功能是否必須是公開或不...)

+0

順便說一下,'DefaultValue'屬性是設計器的屬性窗口將用來啓用右鍵單擊重置功能。 – Reddog 2011-04-20 18:26:49

+0

這裏有更多的手動ShouldSerialize方法DOCO - http://msdn.microsoft.com/en-us/library/53b8022e(v=vs.71).aspx – Reddog 2011-04-20 18:29:19

+0

是有方法相似的地方?在我的構造函數中,我調用了另一個方法,該方法將數據傳遞到數據庫以填充組合框。這次電話會再次在設計階段崩潰。這方面的最佳做法是什麼? – 2011-04-21 16:09:28

2

什麼你要找的是DesignerSerializationVisibilityAttribute。這種控制設計者是否會進行序列化默認爲特定的屬性或不

如果指定爲Hidden設計者不會爲他們

添加值的屬性
相關問題