2008-10-02 6 views
9

Dans .net, j'ai un contrôle hérité:Modification du DefaultValue d'une propriété sur un contrôle .net hérité

public CustomComboBox : ComboBox 

Je veux simplement changer la valeur par défaut de la propriété DropDownStyle, à une autre valeur (ComboBoxStyle. DropDownList) en plus de celui par défaut spécifié 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 dérouter le concepteur Visual Studio. Lorsque vous concevez le 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 confusément, vous trouvez que l'écran ne se comporte pas comme prévu une fois exécuté.

Eh bien, vous ne pouvez pas remplacer la propriété DropDownStyle puisqu'il n'est pas virtuel, mais vous pouvez faire:

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

mais vous des ennuis des nuances de l'utilisation des déclarations « nouvelles ». Je l'ai essayé et cela ne semble pas fonctionner correctement car le concepteur de studio visuel est également désorienté par cette approche et force ComboBoxStyle.DropDown (la valeur par défaut pour la classe de base).

Existe-t-il un autre moyen de le faire? Désolé pour la question verbeuse, il est difficile de décrire en détail.

Répondre

9

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;} 
    } 
} 
+5

Il est dommage qu'il n'y ait pas un moyen d'y parvenir sans avoir à ré-écrire la propriété juste pour ajouter un attribut. – Pondidum

Questions connexes