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.

Tela do sistema de exemplo

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

public enum PaymentStatus
{
    [Description("Em revisão")]
    InReview = 0,
    [Description("Aprovado")]
    Approved = 1,
    [Description("Rejeitado")]
    Rejected = 2
}

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()
{
    if (!typeof(T).IsEnum)
        throw new Exception("T isn't an enumerated type");

    IList list = new List();
    Type type = typeof(T);
    if (type != null)
    {
        Array enumValues = Enum.GetValues(type);
        foreach (T value in enumValues)
        {
            list.Add(value);
        }
    }

    return list;
}

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)
{
    Type tipo = item.GetType();
    FieldInfo fi = tipo.GetField(item.ToString());
    DescriptionAttribute[] atributos = 
	fi.GetCustomAttributes(typeof(DescriptionAttribute), false) 
            as DescriptionAttribute[];
    if (atributos.Length > 0)
        return atributos[0].Description;
    else
        return String.Empty;
}

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)
{
    if (!typeof(T).IsEnum)
        throw new Exception("T isn't an enumerated type");
 
    IList list = EnumToList();
    foreach (T item in list)
    {
        if (((Enum)Enum.Parse(typeof(T), 
               item.ToString())).GetDescription() == description)
            return item;
    }
            
    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.

Listagem 8: Buscando status selecionado por descrição

PaymentStatus statusByDescription = 
    Utility.GetEnumByDescription(
    this.cbbPaymentStatusWithDescription.SelectedItem.ToString());

E é isso pessoal, espero que esse post possa ajuda-los. Um abraço e até a próxima.