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 ?

1voto

Vous pouvez utiliser une méthode d'extension

 public static void EnumForComboBox(this ComboBox comboBox, Type enumType)
 {
     var memInfo = enumType.GetMembers().Where(a => a.MemberType == MemberTypes.Field).ToList();
     comboBox.Items.Clear();
     foreach (var member in memInfo)
     {
         var myAttributes = member.GetCustomAttribute(typeof(DescriptionAttribute), false);
         var description = (DescriptionAttribute)myAttributes;
         if (description != null)
         {
             if (!string.IsNullOrEmpty(description.Description))
             {
                 comboBox.Items.Add(description.Description);
                 comboBox.SelectedIndex = 0;
                 comboBox.DropDownStyle = ComboBoxStyle.DropDownList;
             }
         }   
     }
 }

Comment utiliser ... Déclarer un enum

using System.ComponentModel;

public enum CalculationType
{
    [Desciption("LoaderGroup")]
    LoaderGroup,
    [Description("LadingValue")]
    LadingValue,
    [Description("PerBill")]
    PerBill
}

Cette méthode permet d'afficher la description des éléments de la boîte Combo

combobox1.EnumForComboBox(typeof(CalculationType));

1voto

ScottE Points 11633

J'utilise la méthode d'aide suivante, que vous pouvez lier à votre liste.

    ''' <summary>
    ''' Returns enumeration as a sortable list.
    ''' </summary>
    ''' <param name="t">GetType(some enumeration)</param>
    Public Shared Function GetEnumAsList(ByVal t As Type) As SortedList(Of String, Integer)

        If Not t.IsEnum Then
            Throw New ArgumentException("Type is not an enumeration.")
        End If

        Dim items As New SortedList(Of String, Integer)
        Dim enumValues As Integer() = [Enum].GetValues(t)
        Dim enumNames As String() = [Enum].GetNames(t)

        For i As Integer = 0 To enumValues.GetUpperBound(0)
            items.Add(enumNames(i), enumValues(i))
        Next

        Return items

    End Function

0voto

Rahul Points 1

Méthode générique pour définir un enum 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

public IList<KeyValuePair<string, T>> GetDataSourceFromEnum<T>() where T : struct,IConvertible
    {
        IList<KeyValuePair<string, T>> list = new BindingList<KeyValuePair<string, T>>();
        foreach (string value in Enum.GetNames(typeof(T)))
        {
            list.Add(new KeyValuePair<string, T>(value, (T)Enum.Parse(typeof(T), value)));
        }
        return list;
    }

0voto

Farhad Points 15

Cela a toujours été un problème. si vous avez une Enum triée, comme de 0 à ...

public enum Test
      one
      Two
      Three
 End

vous pouvez lier des noms à la combobox et, au lieu d'utiliser la fonction .SelectedValue utilisation des biens .SelectedIndex

   Combobox.DataSource = System.Enum.GetNames(GetType(test))

et le

Dim x as byte = 0
Combobox.Selectedindex=x

0voto

Dans le Framework 4, vous pouvez utiliser le code suivant :

Pour lier l'enum MultiColumnMode au combobox par exemple :

cbMultiColumnMode.Properties.Items.AddRange(typeof(MultiColumnMode).GetEnumNames());

et pour obtenir l'index sélectionné :

MultiColumnMode multiColMode = (MultiColumnMode)cbMultiColumnMode.SelectedIndex;

note : j'utilise la combobox DevExpress dans cet exemple, vous pouvez faire de même avec la combobox Win Form

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