Domanda

In .net, ho un controllo ereditato:

public CustomComboBox : ComboBox

Voglio semplicemente cambiare il valore predefinito della proprietà DropDownStyle, con un altro valore (ComboBoxStyle.DropDownList) oltre a quello predefinito specificato nella classe base (ComboBoxStyle.DropDown).

Si potrebbe pensare che puoi semplicemente aggiungere il costruttore:

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

Tuttavia, questo approccio confonderà Visual Studio Designer. Quando si progetta il controllo personalizzato in Visual Studio, se si seleziona ComboBoxStyle.DropDown per DropDownStyle si ritiene che la proprietà selezionata sia ancora il valore predefinito (da [DevaultValue ()] nella classe ComboBox di base), quindi non lo fa aggiungere una riga customComboBox.DropDownStyle = ComboBoxStyle.DropDown al file Designer.cs. E abbastanza confusamente, scopri che lo schermo non si comporta come previsto una volta eseguito.

Beh, non puoi sovrascrivere la proprietà DropDownStyle poiché non è virtuale, ma potresti fare:

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

ma allora avrai problemi con le sfumature dell'uso di " new " dichiarazioni. L'ho provato e non sembra funzionare bene dato che il designer di Visual Studio viene confuso anche da questo approccio e forza ComboBoxStyle.DropDown (il valore predefinito per la classe base).

C'è un altro modo per farlo? Ci scusiamo per la domanda dettagliata, è difficile da descrivere in dettaglio.

È stato utile?

Soluzione

Sembra che funzioni:

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;}
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top