2009-04-30 9 views
4

Si je lie un ComboBox WinForms aux valeurs d'un type ENUM, à savoirComboBox lié aux valeurs d'un type enum tout en ayant une entrée "vide"?

combo1.DropDownStyle = ComboBoxStyle.DropDownList; 
combo1.DataSource = Enum.GetValues(typeof(myEnumType)); 

Qui sait comment je pourrais obtenir le même résultat, alors que, en plus des entrées correspondant à chaque valeur ENUM, je peux aussi avoir une entrée vide ne représente aucune sélection?

Je ne peux pas simplement ajouter une valeur spéciale au type enum car cela doit être flexible pour traiter n'importe quel type enum.

J'apprécierais votre aide.

Éditer: Je devrais préciser que je veux lier les valeurs enum réelles et non leurs noms. Si les valeurs enum réelles sont liées, le ComboBox prend soin d'appeler leur ToString() pour obtenir le texte à afficher.

+0

Folks, c'est WinForms, pas ASP.NET. Vous ne pouvez pas ajouter d'éléments à une zone de liste déroulante dans WinForms une fois que la source de données a été définie. –

Répondre

1

(S'il vous plaît voir mon modifier à la question où je Précisé que je ne veux pas se lier à une collection de chaînes).

Après plus de violon, la monstruosité suivante semble fonctionner. combo1.SelectedItem est de type objet et sera soit un DBNull soit une valeur enumée (encadrée?). Ce code est-il conseillé?

combo1.DataSource = (new object[] { DBNull.Value } 
         .Concat(Enum.GetValues(refToAnEnumType) 
          .Cast<object>())).ToList() 

Edit: Je vois Adam et les méthodes d'Andrew pourraient facilement être adaptés pour faire la même chose. Merci les gars!

+0

Maintenant, si je veux sélectionner une valeur nulle, comment dois-je faire? Parce que DBNull n'est pas présent dans Enum alors quelle valeur dois-je sélectionner? –

3

Vous pouvez essayer quelque chose comme ceci:

(modifié pour refléter une excellente suggestion de Brad_Z)

static IEnumerable<String> getValues<T>(String initialValue) 
{ 
    yield return initialValue; 

    foreach (T t in Enum.GetValues(typeof(T))) 
     yield return t.ToString(); 
} 

static IEnumerable<String> getValues<T>() 
{ 
    return getValues<T>(String.Empty); 
} 

Cela vous permettra de lier les résultats de cette fonction comme celle-ci:

combo1.DataSource = getValues<myEnumType>().ToArray(); 

ou comme ceci, si vous souhaitez spécifier une valeur différente pour l'article initial:

combo1.DataSource = getValues<myEnumType>("Select").ToArray(); 
+2

Bonne réponse. J'ajouterais un paramètre à la fonction getValues ​​permettant de spécifier le texte de l'entrée vide. Donc, vous pouvez dire: getValues ​​ ("sélectionner un chat"). ToArray(); –

+0

Excellente suggestion! J'ai modifié pour l'inclure. :) –

+0

Merci pour votre message - Cela fonctionne grassement, sauf que ce sont les valeurs enum réelles que je veux et pas une représentation sous forme de chaîne de leurs noms :-) – xyz

4

Vous ne savez pas si vous avez essayé tout le code que vous avez publié ou non, mais vous ne pouvez pas ajouter d'éléments dans une zone de liste déroulante ComboBox. C'est Winforms, pas WPF, donc il n'y a pas de fonction "DataBind".

Vous pouvez le faire:

public static string[] GetEnumValues<T>(bool includeBlank) 
{ 
    List<string> values = new List<string>((Enum.GetValues(typeof(T)) as T[]).Select(t => t.ToString())); 

    if (includeBlank) 
    { 
     values.Insert(0, string.Empty); 
    } 

    return values.ToArray(); 
} 

Puis

combo.DataSource = GetEnumValues<myEnumType>(true); 
+0

Maintenant, si je veux sélectionner une valeur nulle sur une certaine condition, comment dois-je fais le? Parce que DBNull n'est pas présent dans Enum alors quelle valeur dois-je sélectionner? –