2010-10-19 5 views
2

pour un de mes projets J'ai hérité un ComboBox pour modifier son comportement de taille. En plus de cela que je voulais, pour accélérer ma création de formulaires, pour définir la valeur par défaut DropDownStyle-ComboBoxStyle.DropDownListProblème avec [DefaultValue()] héritant ComboBox

Pour ce faire, je l'ai utilisé la commande [Default()] écraser la propriété DropDownStyle

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

Puis j'ai modifié la valeur par défaut valeur dans Designer en réglant le DropDownStyle sur ComboBoxStyle.DropDownList.

Et voilà le problème ... Il y a un petit nombre de InheritedComboBox que je veux avoir ComboBoxStyle.DropDown parce qu'ils ont besoin de travailler avec

AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Append; 
AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; 

Si je l'ai mis du designer il fonctionne très bien, cependant, parfois, après avoir reconstruit le formulaire, il déclenche une exception (également au moment du design) concernant le ComboBoxStyle. Quand je regarde le fichier FormName.Designer.cs, je peux constater que pour la InheritedComboBox spécifique il n'y a pas

DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDown

et je dois l'ajouter manuellement. Ceci est un peu ennuyeux parce que parfois je le remarque juste à l'exécution, quand le programme jette une exception sans montrer le formulaire et je ne peux pas tester chaque forme chaque fois que je reconstruis ...

Avez-vous une idée pourquoi je reçois ce comportement étrange?

Y at-il un moyen de le réparer?

Merci beaucoup pour toute réponse!

Répondre

1

Lorsque vous définissez la propriété AutoCompleteMode ou AutoCompleteSource, je crois que le concepteur cherche à la ComboBox de base et ne pas générer de la ligne pour définir la DropDownStyle, depuis DropDownest la valeur par défaut pour ComboBox.

j'ai pu corriger cela en ajoutant un AutoCompleteMode et AutoCompleteSource propriété à la ComboBox héritée, mais avait aussi d'ajouter une ligne pour définir la base DropDownStyle en raison de l'ordre dans lequel le concepteur définit les propriétés.

Essayez quelque chose comme ça et voir si cela fonctionne pour vous:

public class MyComboBox : ComboBox 
{ 
    public MyComboBox() 
    { 
     DropDownStyle = ComboBoxStyle.DropDownList; 
     AutoCompleteMode = AutoCompleteMode.None; 
     AutoCompleteSource = AutoCompleteSource.None; 
    } 

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

    [DefaultValue(AutoCompleteMode.None)] 
    public new AutoCompleteMode AutoCompleteMode 
    { 
     get { return base.AutoCompleteMode; } 
     set 
     { 
      if (value != AutoCompleteMode.None) 
       base.DropDownStyle = ComboBoxStyle.DropDown; 

      base.AutoCompleteMode = value; 
     } 
    } 
    [DefaultValue(AutoCompleteSource.None)] 
    public new AutoCompleteSource AutoCompleteSource 
    { 
     get { return base.AutoCompleteSource; } 
     set 
     { 
      if (value != AutoCompleteSource.None) 
       base.DropDownStyle = ComboBoxStyle.DropDown; 

      base.AutoCompleteSource = value; 
     } 
    } 
} 
+0

Merci beaucoup! Cela marche!J'ai remarqué qu'en fait, les propriétés DropDownStyle sont définies par le concepteur, mais après la saisie semi-automatique (il semble être par ordre alphabétique). Probablement cela fonctionne bien pour le ComboBox d'origine parce que DropDown est la valeur par défaut. Je me demande s'il y a un moyen d'affecter l'ordre dans lequel les propriétés sont assignées par le concepteur .. j'ai essayé de chercher mais je n'ai rien trouvé. –

+0

Super, content que ça a marché pour vous. J'ai également cherché un moyen de changer l'ordre (j'ai cherché un attribut), mais je n'ai rien trouvé. –

0

Essayez également de définir cette valeur sur la propriété dans le constructeur de la liste déroulante héritée à la valeur que vous avez définie avec DefaultValue. Cela devrait probablement résoudre votre problème.

+0

Non, malheureusement cela n'a pas aidé –

+0

Le problème que vous décrivez ne semble un peu comme ce serait la question. .NET est confus lorsque DefaultValue et la valeur définie par le constructeur sont désynchronisées. Essayez de supprimer l'affectation de Designer.cs, redéfinissez-la dans la liste des propriétés et voyez si cela vous aide. –

+0

Le problème est que VS le supprimer de son propre chef, et je dois toujours l'écrire manuellement à nouveau. J'ai également essayé de le supprimer et de le redéfinir dans le concepteur ou manuellement, mais cela n'a pas fonctionné. –