Carregando ComboBox dinamicamente com Enum
Veja nesse artigo como carregar um ComboBox (WindowsForms) dinamicamente através de um Enum. Essa prática pode evitar problemas futuros, quando for preciso adicionar ou remover itens do Enum. Além disso vamos ver também como utilizar descrições
Veja nesse artigo como carregar um ComboBox (WindowsForms) dinamicamente através de um Enum. Essa prática pode evitar problemas futuros, quando for preciso adicionar mais um item ao Enum. Se os ComboBoxs (ou outros componentes) que dependem desse Enum não estiverem sendo carregados dinamicamente, será necessário encontrar a atualizar todos eles. Também será demostrado como utilizar descrições para os itens do Enum, possibilitando uma melhor visão para o usuário.
Para demostrar um exemplo foi criado um projeto no Visual Studio 2010 com o framework 4.0 e utilizado a linguagem C#. O projeto exemplo está disponível para download.
Primeiramente vamos criar um projeto com um Windows Forms, e nesse vamos adicionar dois ComboBoxs, um Button e um TextBox, como mostra a Figura 1.
Figura 1. Tela do sistema de exemplo.
Agora vamos criar um Enum, para efeito de exemplo esse Enum vai representar os status de pagamentos. No Enum já vamos definir as descrições para cada item, como mostra listagem 1.
Listagem 1: Definição do Enum PaymentStatus
[Description("Em revisão")]
InReview = 0,
[Description("Aprovado")]
[Description("Rejeitado")]
Para carregar os ComboBoxs vamos criar um método utilitário para criar uma lista de Enums a partir de um tipo de Enum.
Listagem 2: Método responsável por criar um lista a partir de um tipo de Enum
public static IList EnumToList()
throw new Exception("T isn't an enumerated type");
Agora com esse método, vamos carrega o nosso primeiro ComboBox, para isso precisamos apenas definir a propriedade DataSource do componente, veja a listagem 1.
Listagem 3: Carregando um ComboBox
private void LoadPaymentStatus()
this.cbbPaymentStatus.DataSource = Utility.EnumToList();
E para recuperar o status selecionado podemos utilizar a propriedade SelectedItem do ComboBox, porém precisamos fazer uma conversão para o tipo do Enum que está sendo utilizado, como mostra a listagem 4.
Listagem 4: Recuperando o status selecionado no ComboBox
PaymentStatus status = (PaymentStatus)this.cbbPaymentStatus.SelectedItem;
Pronto, o nosso ComboBox já está sendo carregado de forma dinâmica, agora se for adicionado um novo item ao Enum, a alteração será refletida no ComboBox, porém se vocês perceberem nos itens do ComboBox estão sendo apresentados os nomes de cada item do Enum, em inglês e sem espaços. Vamos então ver como carregar com as descrições, que foram definidas no inicio do post. Primeiramente vamos criar um método de extensão (Listagem 5) para capturar a descrição de cada item do Enum.
Listagem 5: Método de extensão para buscar a descrição de um item de Enum
public static String GetDescription(this Enum item)
FieldInfo fi = tipo.GetField(item.ToString());
DescriptionAttribute[] atributos =
fi.GetCustomAttributes(typeof(DescriptionAttribute), false)
if (atributos.Length > 0)
return atributos[0].Description;
Agora vamos carregar o ComboBox com as descrições, veja como na listagem 6.
Listagem 6: Carregando um ComboBox com descrições
private void LoadPaymentStatusWithDescription()
foreach (PaymentStatus status in Utility.EnumToList())
this.cbbPaymentStatusWithDescription.Items.Add(status.GetDescription());
this.cbbPaymentStatusWithDescription.SelectedIndex = 0;
Pronto, o ComboBox está sendo apresentado com as descrições. Para recuperar o valor selecionado, vamos criar um método que retorne um enum a partir de sua descrição (Listagem 7).
Listagem 7: Buscado Enum por descrição
public static T GetEnumByDescription(String description)
IList list = EnumToList();
if (((Enum)Enum.Parse(typeof(T),
item.ToString())).GetDescription() == description)
throw new Exception("The description is invalid");
E para recuperar o status selecionado no ComboBox podemos como anteriormente utilizar a propriedade SelectedItem, veja na listagem 8.