136 votes

Lier une énumération à une boîte combo WinForms, puis la définir

De nombreuses personnes ont répondu à la question de savoir comment lier une énumération à une boîte combo dans WinForms. C'est comme ça :

comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));

Mais cela ne sert à rien si l'on ne peut pas 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 a-t-il une idée de la manière de procéder ?

8voto

Jordan Points 2320

Cette réponse ne sera probablement jamais vue parmi toutes les autres réponses, mais voici le code que j'ai trouvé, qui a l'avantage d'utiliser l'attribut DescriptionAttribute si elle existe, mais sinon en utilisant le nom de la valeur de l'enum elle-même.

J'ai utilisé un dictionnaire parce qu'il a un modèle clé/valeur tout fait. A List<KeyValuePair<string,object>> fonctionnerait également, sans le hachage inutile, mais un dictionnaire permet d'obtenir un code plus propre.

J'ai des membres qui ont un MemberType de Field et qui sont littérales. Cela crée une séquence composée uniquement de membres qui sont des valeurs d'énumération. Ceci est robuste puisqu'un enum ne peut pas avoir d'autres champs.

public static class ControlExtensions
{
    public static void BindToEnum<TEnum>(this ComboBox comboBox)
    {
        var enumType = typeof(TEnum);

        var fields = enumType.GetMembers()
                              .OfType<FieldInfo>()
                              .Where(p => p.MemberType == MemberTypes.Field)
                              .Where(p => p.IsLiteral)
                              .ToList();

        var valuesByName = new Dictionary<string, object>();

        foreach (var field in fields)
        {
            var descriptionAttribute = field.GetCustomAttribute(typeof(DescriptionAttribute), false) as DescriptionAttribute;

            var value = (int)field.GetValue(null);
            var description = string.Empty;

            if (!string.IsNullOrEmpty(descriptionAttribute?.Description))
            {
                description = descriptionAttribute.Description;
            }
            else
            {
                description = field.Name;
            }

            valuesByName[description] = value;
        }

        comboBox.DataSource = valuesByName.ToList();
        comboBox.DisplayMember = "Key";
        comboBox.ValueMember = "Value";
    }

}

6voto

Pavel Šubík Points 1

Essayez ça :

// fill list
MyEnumDropDownList.DataSource = Enum.GetValues(typeof(MyEnum));

// binding
MyEnumDropDownList.DataBindings.Add(new Binding("SelectedValue", StoreObject, "StoreObjectMyEnumField"));

StoreObject est mon exemple d'objet avec la propriété StoreObjectMyEnumField pour stocker la valeur MyEnum.

5voto

Mickey Perlstein Points 642
 public static void FillByEnumOrderByNumber<TEnum>(this System.Windows.Forms.ListControl ctrl, TEnum enum1, bool showValueInDisplay = true) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");

        var values = from TEnum enumValue in Enum.GetValues(typeof(TEnum))
                     select
                        new
                         KeyValuePair<TEnum, string>(   (enumValue), enumValue.ToString());

        ctrl.DataSource = values
            .OrderBy(x => x.Key)

            .ToList();

        ctrl.DisplayMember = "Value";
        ctrl.ValueMember = "Key";

        ctrl.SelectedValue = enum1;
    }
    public static void  FillByEnumOrderByName<TEnum>(this System.Windows.Forms.ListControl ctrl, TEnum enum1, bool showValueInDisplay = true  ) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");

        var values = from TEnum enumValue in Enum.GetValues(typeof(TEnum))
                     select 
                        new 
                         KeyValuePair<TEnum,string> ( (enumValue),  enumValue.ToString()  );

        ctrl.DataSource = values
            .OrderBy(x=>x.Value)
            .ToList();

        ctrl.DisplayMember = "Value";
        ctrl.ValueMember = "Key";

        ctrl.SelectedValue = enum1;
    }

4voto

Shrey Points 13

Cela a marché pour moi :

comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));
comboBox1.SelectedIndex = comboBox1.FindStringExact(MyEnum.something.ToString());

3voto

Tarc Points 318

Sur la base de la réponse de @Amir Shenouda, je me retrouve avec ceci :

Définition de l'Enum :

public enum Status { Active = 0, Canceled = 3 }; 

Définir les valeurs de la liste déroulante à partir de celle-ci :

cbStatus.DataSource = Enum.GetValues(typeof(Status));

Obtention de l'enum de l'élément sélectionné :

Status? status = cbStatus.SelectedValue as Status?;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X