40 votes

Comment lier une énumération à une zone de liste déroulante

Je lierais les valeurs d'une énumération avec un contrôle combobox.

J'ai écrit ce code:

 cboPriorLogicalOperator.DataSource = Enum.GetValues(typeof(MyEnum))
    .Cast<MyEnum>()
    .Select(p => new { Key = (int)p, Value = p.ToString() })
    .ToList();

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

Cela fonctionne bien, mais je me demande s'il existe un moyen plus simple.

25voto

Mikael Östberg Points 10487

Je pense que ton code est magnifique!!!

La seule amélioration serait de placer le code dans une Méthode d'Extension.

EDIT:

Quand je pense à ce sujet, ce que vous voulez faire est d'utiliser l' Enum comme dans la définition et non pas une instance de l'enum, qui est requis par les extensions des méthodes.

J'ai trouvé cette question, ce qui résout-il vraiment bien:

public class SelectList
{
    // Normal SelectList properties/methods go here

    public static Of<T>()
    {
       Type t = typeof(T);
       if (t.IsEnum)
       {
           var values = from Enum e in Enum.GetValues(type)
                        select new { ID = e, Name = e.ToString() };
           return new SelectList(values, "Id", "Name");
       }
       return null;
    }
}

// called with 
var list = SelectList.Of<Things>();

Vous seul pouvez retourner un Dictionary<int, string> et pas un SelectList, mais vous obtenez l'idée.

EDIT2:

Ici, nous allons avec un exemple de code qui couvre le cas où vous êtes en train de regarder.

public class EnumList
{
    public static IEnumerable<KeyValuePair<T, string>> Of<T>()
    {
        return Enum.GetValues(typeof (T))
            .Cast<T>()
            .Select(p => new KeyValuePair<T, string>(p, p.ToString()))
            .ToList();
    }
}

Ou cette version peut-être, où la clé est un int

public class EnumList
{
    public static IEnumerable<KeyValuePair<int, string>> Of<T>()
    {
        return Enum.GetValues(typeof (T))
            .Cast<T>()
            .Select(p => new KeyValuePair<int, string>(Convert.ToInt32(p), p.ToString()))
            .ToList();
    }
}

6voto

Jacob Seleznev Points 4761

Pourquoi ne pas utiliser:

 myComboBox.DataSource  = Enum.GetValues(typeof(MyEnum))
 

?

1voto

ColoradoRockie Points 666
foreach (int r in Enum.GetValues(typeof(MyEnum))) 
{
     var item = new ListItem(Enum.GetName(typeof(MyEnum), r), r.ToString());
     ddl.Items.Add(item);
}

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