Question

En .net, j'ai un contrôle hérité:

public CustomComboBox : ComboBox

Je veux simplement changer la valeur par défaut de la propriété DropDownStyle, en une autre valeur (ComboBoxStyle.DropDownList) en plus de celle par défaut spécifiée dans la classe de base (ComboBoxStyle.DropDown).

On pourrait penser que vous pouvez simplement ajouter le constructeur:

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

Cependant, cette approche va confondre le Concepteur Visual Studio. Lors de la conception du contrôle personnalisé dans Visual Studio, si vous sélectionnez ComboBoxStyle.DropDown pour DropDownStyle, il pense que la propriété que vous avez sélectionnée est toujours la valeur par défaut (à partir de [DevaultValue ()] dans la classe ComboBox de base). ajoutez une ligne customComboBox.DropDownStyle = ComboBoxStyle.DropDown au fichier Designer.cs. Et assez déroutant, vous constatez que l’écran ne se comporte pas comme prévu une fois exécuté.

Vous ne pouvez pas remplacer la propriété DropDownStyle car elle n'est pas virtuelle, mais vous pouvez le faire:

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

mais vous rencontrerez des problèmes avec les nuances inhérentes à l'utilisation de "nouveau". déclarations. Je l’ai essayé et cela ne semble pas fonctionner correctement, car le concepteur de Visual Studio est également dérouté par cette approche et force ComboBoxStyle.DropDown (valeur par défaut pour la classe de base).

Y a-t-il un autre moyen de faire cela? Désolé pour la question commentée, il est difficile de décrire en détail.

Était-ce utile?

La solution

Cela ressemble à cela fonctionne:

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;}
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top