2008-10-02 107 views
9

在.NET中,我有一個繼承控制:上繼承.NET控件更改屬性的默認值

public CustomComboBox : ComboBox 

我只是想更改DropDownStyle屬性的默認值,另一個值(ComboBoxStyle。 DropDownList)除了在基類(ComboBoxStyle.DropDown)中指定的默認值之外。

有人可能會認爲你可以添加構造:

public CustomComboBox() 
{ 
    this.DropDownStyle = ComboBoxStyle.DropDownList; 
} 

但是,這種方法會混淆在Visual Studio設計。在Visual Studio中設計自定義控件時,如果爲DropDownStyle選擇ComboBoxStyle.DropDown,它會認爲您選擇的屬性仍然是默認值(來自基礎ComboBox類中的[DevaultValue()]),所以它不會將一個customComboBox.DropDownStyle = ComboBoxStyle.DropDown行添加到Designer.cs文件。令人困惑的是,你發現屏幕一旦運行就不會像預期的那樣運行。

那麼你不能覆蓋DropDownStyle屬性,因爲它不是虛擬的,但你可以這樣做:

[DefaultValue(typeof(ComboBoxStyle), "DropDownList")] 
public new ComboBoxStyle DropDownStyle 
{ 
     set { base.DropDownStyle = value; } 
     get { return base.DropDownStyle; } 
} 

但隨後你會遇到麻煩使用「new」聲明的細微差別。我試過了,它似乎並沒有正常工作,因爲視覺工作室設計師也從這種方法中感到困惑,並強制ComboBoxStyle.DropDown(基類的默認設置)。

有沒有其他方法可以做到這一點?對於詳細的問題抱歉,很難詳細描述。

回答

9

這看起來像它的工作原理:

public class CustomComboBox : ComboBox 
{ 
    public CustomComboBox() 
    { 
     base.DropDownStyle = ComboBoxStyle.DropDownList; 
    } 

    [DefaultValue(ComboBoxStyle.DropDownList)] 
    public new ComboBoxStyle DropDownStyle 
    { 
     set { base.DropDownStyle = value; Invalidate(); } 
     get { return base.DropDownStyle;} 
    } 
} 
+5

這是一個恥辱有沒有辦法做到這一點,而無需重新實現屬性只是添加屬性。 – Pondidum 2009-10-07 12:45:57