2016-03-11 18 views
7

Widziałem przez Stackoverflow, że nie jest to łatwy sposób, aby wypełnić combobox z liczby:Bind Combobox z Enum Opis

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

W moim przypadku mam zdefiniowane niektórych opis moich wyliczeń:

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} 

To działa całkiem dobrze, ale pokazuje wartość, a nie opis. Mój problem polega na tym, że chcę pokazać w combobox opis wyliczenia, gdy ma on opis lub wartość w przypadku, gdy nie ma mieć wartość. Jeśli to konieczne, mogę dodać opis wartości, które nie mają opisu. Thx z góry.

Odpowiedz

13

Spróbuj tego:

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

Aby to działało, wszystkie wartości muszą mieć opis lub dostaniesz wyjątek NullReference. Nadzieja, która pomaga.

+0

Doskonale, dziękuję bardzo. – Dinalan

+0

Jest to bardzo przydatne. Ale w jaki sposób ustawiasz pole kombi na konkretny element? – user2430797

0

Oto, co wymyśliłem, ponieważ musiałem ustawić również domyślne.

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

Zastosowanie:

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

Gdzie cmbFileType jest ComboBox i "FileType" jest enum.