Ligando um controle à um Enum

As enumerações, ou simplesmente enums, são comumentes usados para substituir valores mágicos e deixando o código mais legível e auto-documentado.

Mas em Asp.NET, às vezes se torna necessário listar os “valores” de um enum. “Valores” está entre aspas porque não é necessariamente o valor que a gente quer ligar, pois este valor é um número inteiro.

public enum CMYK
{
    CYAN,
    MAGENTA,
    YELLOW,
    KEY
}

No caso, CYAN = 0, MAGENTA = 1 e daí em diante. Seria legal então podermos ligar (através do DataSource/DataBind) este nosso enum em um controle, por exemplo um DropDownList, que deve apresentar CYAN, MAGENTA, YELLOW e KEY como opções.

protected System.Web.UI.WebControls.DropDownList ddColorComponent;

private void Page_Load(object sender, System.EventArgs e)
{
    if(!IsPostBack)
    {
        ddColorComponent.DataSource = Enum.GetNames(typeof(CMYK));
        ddColorComponent.DataBind();
    }
}

private void ddColorComponent_SelectedIndexChanged(object sender, System.EventArgs e)
{
     Color selectedColor = (Color)Enum.Parse(ddColorComponent.SelectedValue);
}

Podemos melhorar isto e dar nomes mais descritivos aos nossos enums através de atributos:

using System.ComponentModel;

public enum CMYK
{
    [Description("Ciano")]
    CYAN,
    [Description("Magenta")]
    MAGENTA,
    [Description("Amarelo")]
    YELLOW,
    [Description("Preto")]
    KEY
}

Nesta solução, no entanto, devemos escrever o código que fornece uma lista de elementos para ser usada como DataSource. Primeiro devemos extrair o conteúdo inserido como atributo do enum através de reflection:

using System.ComponentModel;
using System.Reflection;
...
...
public static string GetDescription(Enum value)
{
    FieldInfo fieldInfo = value.GetType().GetField(value.ToString());
    DescriptionAttribute[] attributes  = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
    return (attributes.Length > 0) ? attributes[0].Description : value.ToString();
}

Assim é possível iterar por todos os itens do enum, criando uma lista:

public static List> GetValuesAndDescription(System.Type enumType)
{
    List> kvPairList = new List>();

    foreach (Enum enumValue in Enum.GetValues(enumType))
    {
        kvPairList.Add(new KeyValuePair(enumValue.ToString(), GetDescription(enumValue)));
    }

    return kvPairList;
}

O DataBind fica assim:

ddColorComponent.DataSource = EnumDescription.GetValuesAndDescription(typeof(CMYK));
ddColorComponent.DataTextField = "Value";
ddColorComponent.DataValueField = "Key";

Fonte: http://developcode.blogspot.com/2006/12/dropdownlists-with-enums-as-datasource.html

Posts relacionados

This entry was posted in programação, web and tagged . Bookmark the permalink.

Deixe um Comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>