beaucoup de gens ont répondu à la question de savoir comment lier une énumération à une zone de liste déroulante dans WinForms. C'est comme ça:
comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));
Mais c'est assez inutile sans pouvoir définir la valeur réelle à afficher.
J'ai essayé:
comboBox1.SelectedItem = MyEnum.Something; // Does not work. SelectedItem remains null
J'ai également essayé:
comboBox1.SelectedIndex = Convert.ToInt32(MyEnum.Something); // ArgumentOutOfRangeException, SelectedIndex remains -1
Quelqu'un at-il des idées sur la façon de procéder?
SelectedValue
cause un problèmeInvalidOperationException
. "Impossible de définir leSelectedValue
dans unListControl
avec un videValueMember
."Réponses:
L'Enum
Définition des valeurs déroulantes à partir de celui-ci
Obtenir l'énumération de l'élément sélectionné
la source
Pour simplifier:
Initialisez d'abord cette commande: (par exemple après
InitalizeComponent()
)Pour récupérer l'élément sélectionné dans la liste déroulante:
Si vous souhaitez définir la valeur de la zone de liste déroulante:
la source
Le code
est ok, le problème doit résider dans le DataBinding. Les affectations de DataBinding se produisent après le constructeur, principalement la première fois que la zone de liste déroulante est affichée. Essayez de définir la valeur dans l'événement Load. Par exemple, ajoutez ce code:
Et vérifiez si cela fonctionne.
la source
Essayer:
MODIFIER:
Oups, vous avez déjà essayé. Cependant, cela a fonctionné pour moi lorsque ma comboBox a été définie pour être une DropDownList.
Voici mon code complet qui fonctionne pour moi (avec DropDown et DropDownList):
la source
Disons que vous avez l'énumération suivante
Vous devez avoir une structure pour mapper ces valeurs à une chaîne:
Maintenant, retournez un tableau d'objets avec toutes les énumérations mappées sur une chaîne:
Et utilisez ce qui suit pour remplir votre zone de liste déroulante:
Créez une fonction pour récupérer le type enum juste au cas où vous voudriez le passer à une fonction
et alors tu devrais être ok :)
la source
Tuple
place). Je transformerais la valeur enum et la description en propriétés, puis ajouterais unnumberCB.DisplayProperty = "Caption"
; `etnumberCB.ValueProperty = "Num"
pour que vous puissiez l'utiliserSelectedValue
directement et vous y lier.Essaye ça:
StoreObject est mon exemple d'objet avec la propriété StoreObjectMyEnumField pour la valeur de stockage MyEnum.
la source
la source
c'est la solution pour charger l'élément d'énumération dans combobox:
Et puis utilisez l'élément enum comme texte:
la source
Sur la base de la réponse de @Amir Shenouda, je me retrouve avec ceci:
Définition d'énum:
Définition des valeurs déroulantes à partir de celui-ci:
Obtention de l'énumération à partir de l'élément sélectionné:
la source
la source
Source complète ... Lier une énumération à Combobox
la source
J'utilise la méthode d'aide suivante, que vous pouvez lier à votre liste.
la source
Convertissez l'énumération en une liste de chaînes et ajoutez-la à la comboBox
Définissez la valeur affichée à l'aide de selectedItem
la source
Aucun de ceux-ci n'a fonctionné pour moi, mais cela a fonctionné (et cela avait l'avantage supplémentaire de pouvoir avoir une meilleure description pour le nom de chaque énumération). Je ne sais pas si cela est dû à des mises à jour .net ou non, mais quoi qu'il en soit, je pense que c'est le meilleur moyen. Vous devrez ajouter une référence à:
using System.ComponentModel;
Ensuite, lorsque vous souhaitez accéder aux données, utilisez ces deux lignes:
la source
Cela ne sera probablement jamais vu parmi toutes les autres réponses, mais c'est le code que j'ai trouvé, cela a l'avantage d'utiliser le
DescriptionAttribute
s'il existe, mais sinon d'utiliser le nom de la valeur enum elle-même.J'ai utilisé un dictionnaire car il a un modèle d'élément clé / valeur prêt à l'emploi. A
List<KeyValuePair<string,object>>
fonctionnerait également et sans le hachage inutile, mais un dictionnaire rend le code plus propre.Je reçois des membres qui ont un
MemberType
deField
et qui sont littéraux. Cela crée une séquence de membres uniquement qui sont des valeurs d'énumération. Ceci est robuste car une énumération ne peut pas avoir d'autres champs.la source
devrait fonctionner très bien ... Comment pouvez-vous dire que
SelectedItem
c'est nul?la source
Vous pouvez utiliser les fonctions "FindString ..":
la source
Vous pouvez utiliser une liste de valeurs KeyValuePair comme source de données pour la zone de liste déroulante. Vous aurez besoin d'une méthode d'assistance où vous pouvez spécifier le type d'énumération et elle renvoie IEnumerable> où int est la valeur de enum et string est le nom de la valeur d'énumération. Dans votre liste déroulante, définissez la propriété DisplayMember sur «Key» et la propriété ValueMember sur «Value». Value et Key sont des propriétés publiques de la structure KeyValuePair. Ensuite, lorsque vous définissez la propriété SelectedItem sur une valeur enum comme vous le faites, cela devrait fonctionner.
la source
Pour le moment, j'utilise la propriété Items plutôt que DataSource, cela signifie que je dois appeler Add pour chaque valeur d'énumération, mais c'est une petite énumération et son code temporaire quand même.
Ensuite, je peux simplement faire le Convert.ToInt32 sur la valeur et le définir avec SelectedIndex.
Solution temporaire, mais YAGNI pour l'instant.
Vive les idées, je les utiliserai probablement lorsque je créerai la bonne version après avoir reçu les commentaires des clients.
la source
Ancienne question peut-être ici mais j'avais le problème et la solution était simple et facile, j'ai trouvé ceci http://www.c-sharpcorner.com/UploadFile/mahesh/1220/
Il utilise la banque de données et fonctionne bien, alors vérifiez-le.
la source
Ces deux fonctionnent pour moi, êtes-vous sûr qu'il n'y a pas autre chose qui ne va pas?
la source
enum MyEnum { Something = 47 }
Méthode générique pour définir une énumération comme source de données pour les listes déroulantes
L'affichage serait le nom. La valeur sélectionnée serait Enum elle-même
la source
Cela a toujours été un problème. si vous avez une énumération triée, comme de 0 à ...
vous pouvez lier les noms à la liste déroulante et au lieu d'utiliser la
.SelectedValue
propriété, utilisez.SelectedIndex
et le
la source
Dans Framework 4, vous pouvez utiliser le code suivant:
Pour lier l'énumération MultiColumnMode à la zone de liste déroulante, par exemple:
et pour obtenir l'index sélectionné:
Remarque: j'utilise DevExpress combobox dans cet exemple, vous pouvez faire la même chose dans Win Form Combobox
la source
Un peu en retard à cette fête,
La méthode SelectedValue.ToString () doit extraire le DisplayedName. Cependant, cet article DataBinding Enum et With Descriptions montre un moyen pratique non seulement d'avoir cela, mais à la place, vous pouvez ajouter un attribut de description personnalisé à l'énumération et l'utiliser pour votre valeur affichée si vous préférez. Très simple et facile et environ 15 lignes de code (sauf si vous comptez les accolades) pour tout.
C'est un code assez astucieux et vous pouvez en faire une méthode d'extension pour démarrer ...
la source
utilisez uniquement la diffusion de cette façon:
la source
Vous pouvez utiliser une méthode d'extension
Comment utiliser ... Declare enum
Cette méthode affiche la description dans les éléments de la zone de liste déroulante
la source
Cela a fonctionné pour moi:
la source