2016-03-11 11 views
7

ich durch Stackoverflow haben gesehen, dass es eine einfache Möglichkeit ist es, eine Combobox mit einer Enumeration zu füllen:Bind Combobox mit Enum Beschreibung

cbTipos.DataSource = Enum.GetValues(typeof(TiposTrabajo)); 

In meinem Fall habe ich einige Beschreibung für meine Aufzählungen definiert haben:

public enum TiposTrabajo 
    {     
     [Description("Programacion Otros")] 
     ProgramacionOtros = 1,   
     Especificaciones = 2, 
     [Description("Pruebas Taller")] 
     PruebasTaller = 3, 
     [Description("Puesta En Marcha")] 
     PuestaEnMarcha = 4, 
     [Description("Programación Control")] 
     ProgramacionControl = 5} 

Das funktioniert ziemlich gut, aber es zeigt den Wert, nicht die Beschreibung Mein Problem ist, dass ich in der Combobox die Beschreibung der Aufzählung zeigen soll, wenn es eine Beschreibung oder den Wert in dem Fall nicht hat Wert haben. Wenn es notwendig ist, kann ich eine Beschreibung für die Werte hinzufügen, die keine Beschreibung haben. Thx im Voraus.

Antwort

13

Try this:

cbTipos.DisplayMember = "Description"; 
cbTipos.ValueMember = "Value"; 
cbTipos.DataSource = Enum.GetValues(typeof(TiposTrabajo)) 
    .Cast<Enum>() 
    .Select(value => new 
    { 
     (Attribute.GetCustomAttribute(value.GetType().GetField(value.ToString()), typeof(DescriptionAttribute)) as DescriptionAttribute).Description, 
     value 
    }) 
    .OrderBy(item => item.value) 
    .ToList(); 

Damit dies funktioniert, werden alle Werte eine Beschreibung haben müssen, oder Sie werden eine Nullreference Ausnahme erhalten. Ich hoffe, das hilft.

+0

Perfekt, vielen Dank. – Dinalan

+0

Dies ist sehr nützlich. Aber wie stellen Sie das Kombinationsfeld auf ein bestimmtes Element ein? – user2430797

0

Hier ist, was ich gefunden habe, da ich auch den Standard einstellen musste.

public static void BindEnumToCombobox<T>(this ComboBox comboBox, T defaultSelection) 
{ 
    var list = Enum.GetValues(typeof(T)) 
     .Cast<T>() 
     .Select(value => new 
     { 
      (Attribute.GetCustomAttribute(value.GetType().GetField(value.ToString()), typeof(DescriptionAttribute)) as DescriptionAttribute).Description, 
      value 
     }) 
     .OrderBy(item => item.value.ToString()) 
     .ToList(); 

    comboBox.DataSource = list; 
    comboBox.DisplayMember = "Description"; 
    comboBox.ValueMember = "value"; 

    foreach (var opts in list) 
    { 
     if (opts.value.ToString() == defaultSelection.ToString()) 
     { 
      comboBox.SelectedItem = opts; 
     } 
    } 
} 

Verbrauch:

cmbFileType.BindEnumToCombobox<FileType>(FileType.Table); 

Wo cmbFileType ist die ComboBox und "Filetype" ist der Enum.

Verwandte Themen