2016-03-11 31 views
7

ho visto attraverso StackOverflow che c'è un modo semplice per popolare una casella combinata con un'Enumeration:Bind Combobox con Enum Descrizione

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

Nel mio caso ho definito alcuni Descrizione per i miei enumerazioni:

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} 

Questo funziona abbastanza bene, ma mostra il valore, non la descrizione Il mio problema è che voglio mostrare nella casella combinata la descrizione dell'enumerazione quando ha una descrizione o il valore nel caso in cui non avere valore Se è necessario posso aggiungere una descrizione per i valori che non hanno descrizione. Thx in anticipo.

risposta

13

Prova questo:

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(); 

Affinché ciò funzioni, tutti i valori devono avere una descrizione o si otterrà un Exception NullReference. Spero possa aiutare.

+0

Perfetto, grazie mille. – Dinalan

+0

Questo è molto utile. Ma come si imposta la casella combinata su un particolare oggetto? – user2430797

0

Ecco cosa mi è venuto in mente poiché era necessario impostare anche il valore predefinito.

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; 
     } 
    } 
} 

Usage:

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

Dove cmbFileType è il ComboBox e "filetype" è l'enum.