2008-10-02 14 views
9

En .NET, tengo un control heredado:Cambio de la ValorPredeterminado de una propiedad en un control de .NET heredada

public CustomComboBox : ComboBox 

Simplemente quiero cambiar el valor predeterminado de la propiedad DropDownStyle, a otro valor (ComboBoxStyle. DropDownList) además del predeterminado especificado en la clase base (ComboBoxStyle.DropDown).

Uno podría pensar que sólo puede agregar el constructor:

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

Sin embargo, este enfoque va a confundir el diseñador de Visual Studio. Al diseñar el control personalizado en Visual Studio, si selecciona ComboBoxStyle.DropDown para DropDownStyle, piensa que la propiedad que seleccionó sigue siendo el valor predeterminado (de [DevaultValue()] en la clase base ComboBox), por lo que no agregue una línea customComboBox.DropDownStyle = ComboBoxStyle.DropDown al archivo Designer.cs. Y lo suficientemente confuso, usted encuentra que la pantalla no se comporta como se pretendía una vez que se ejecutó.

Así no se puede anular la propiedad DropDownStyle ya que no es virtual, pero que podría ser:

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

pero luego que se ejecutará en problemas de los matices de la utilización de "nuevos" declaraciones. Lo probé y parece que no funciona bien, ya que el diseñador de estudio visual se confunde también con este enfoque y fuerza a ComboBoxStyle.DropDown (el valor predeterminado para la clase base).

¿Hay alguna otra manera de hacerlo? Perdón por la pregunta detallada, es difícil describir en detalle.

Respuesta

9

Esto parece que funciona:

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

Es una pena que no es una forma de lograr esto sin tener que volver a implementar la propiedad sólo para añadir un atributo. – Pondidum

Cuestiones relacionadas