2010-11-20 44 views
0

Supposons que j'ai plusieurs énumérations ... représentant par exemple les fournisseurs de base de données: Unknown, Oracle, Sybase, SQL Server 2005, SQL Server 2008, etc. Je veux laisser l'utilisateur choisir entre tous ceux-ci, mais un Unknown à partir d'une zone de liste déroulante. Lorsque l'utilisateur sélectionne une énumération, il devrait voir une description lisible par l'homme (qui, espérons-le, proviendrait d'un attribut). Toutefois, l'objet réel sélectionné doit être une énumération de ce type spécifique.Comment coller un ENUM dans un .Net WinForm ComboBox

Cela peut être piraté ensemble manuellement à l'aide d'un dictionnaire supplémentaire, mais je ne veux pas faire cela, et plutôt utiliser une manière idiomatique et la plus propre possible.

Voulez-vous partager un exemple de code, ou au moins un bon lien?

P.S. Existe-t-il un moyen facile d'obtenir une collection de toutes les énumérations du fournisseur de type, à l'exception de Unknown (qui aura une valeur courte/int de 0, tel que prescrit par Bill Wagner)?

+0

double possible de [? Comment dois-je un combobox lié enum avec chaîne personnalisée mise en forme pour les valeurs ENUM] (http://stackoverflow.com/questions/796607/how -do-i-have-an-enum-lié-combobox-avec-custom-string-formatting-for-e num-valu) – nawfal

Répondre

4

P.S. Existe-t-il un moyen facile d'obtenir une collection de toutes les énumérations du fournisseur de type, à l'exception de Unknown (qui aura une valeur courte/int de 0, tel que prescrit par Bill Wagner)?

DbVendor[] values = Enum.GetValues(typeof(DbVendor)) 
         .Cast<DbVendor>() 
         .Where(v => v != DbVendor.Unknown) 
         .ToArray(); 

Pour associer un nom convivial aux valeurs, vous pouvez utiliser DescriptionAttribute, comme le montre this answer. Gérer l'événement Format du ComboBox pour afficher la description:

private void comboBoxVendor_Format(object sender, ListControlConvertEventArgs e) 
{ 
    DbVendor vendor = (DbVendor)e.ListItem; 
    e.Value = vendor.GetDescription(); 
} 

Note: si votre application doit être localisable, l'attribut Description est probablement pas la meilleure option. Au lieu de cela, vous pouvez utiliser les ressources de chaîne avec des noms comme DisplayName_DbVendor_Oracle, DisplayName_DbVendor_SqlServer, etc. Vous pouvez alors récupérer le nom d'affichage pour une valeur comme suit:

DbVendor vendor = ...; 
string displayName = Properties.Resources.ResourceManager.GetString("DisplayName_DbVendor_" + vendor); 

EDIT: si vous devez trier les valeurs par la description , il suffit de changer la requête LINQ comme suit:

DbVendor[] values = Enum.GetValues(typeof(DbVendor)) 
         .Cast<DbVendor>() 
         .Where(v => v != DbVendor.Unknown) 
         .OrderBy(v => v.GetDescription()) 
         .ToArray(); 
+0

+1 Bonne réponse, merci! –

+0

Quelques suivis: A) Ai-je besoin de matérialiser le 'IEnumerable' d'enums dans un tableau, avant de pouvoir le charger dans une combo WinForm au moment de l'exécution? B) Lors de la commande de ces articles - la liste des enums maintiendra-t-elle l'ordre dans lequel ils ont été déclarés? Si je voulais trier explicitement par la description, comment aurais-je besoin de modifier cette requête LINQ? –

+1

A) Je ne suis pas sûr de savoir comment cela fonctionnerait si vous avez simplement assigné IEnumerable directement au DataSource ... J'utilise généralement ToArray ou ToList pour m'assurer que la requête ne sera exécutée qu'une seule fois. B) voir ma modification –