Pregunta

En .net, tengo un control heredado:

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 simplemente puede agregar el constructor:

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

Sin embargo, este enfoque confundirá al Diseñador de Visual Studio. Al diseñar el Control personalizado en Visual Studio, si selecciona ComboBoxStyle.DropDown para DropDownStyle, cree que la propiedad que seleccionó sigue siendo el valor predeterminado (de [DevaultValue ()] en la clase ComboBox básica), por lo que no agregue una línea customComboBox.DropDownStyle = ComboBoxStyle.DropDown al archivo Designer.cs. Y lo suficientemente confuso, encuentras que la pantalla no se comporta como se esperaba una vez que se ejecutó.

Bueno, no puede anular la propiedad DropDownStyle ya que no es virtual, pero podría hacer:

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

pero luego se encontrará con problemas por los matices de usar " nuevo " declaraciones Lo he intentado y no parece funcionar bien ya que el diseñador de estudio visual también se confunde con este enfoque y obliga a ComboBoxStyle.DropDown (el valor predeterminado para la clase base).

¿Hay alguna otra forma de hacer esto? Lo siento por la pregunta detallada, es difícil de describir en detalle.

¿Fue útil?

Solución

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;}
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top