En muchos programas se suelen dar a los usuarios una serie de opciones para que escoja. Por ejemplo un tipo de b煤squeda a realizar, un rango de posibles valores para parametrizar alg煤n comportamiento, etc...

Lo m谩s habitual es que estas opciones se "mapeen" despu茅s a elementos de una enumeraci贸n en el c贸digo de la capa de negocio. De esta forma si definimos una enumeraci贸n similar a esta:

public enum EstadoCivil
{
聽 Casado,
聽 Soltero,
聽 Divorciado,
聽 Viudo,
聽 Religioso,
}

lo m谩s com煤n ser谩 que en la interfaz de usuario exista un modo de seleccionar alg煤n valor equivalente, por ejemplo a trav茅s de una lista desplegable o un conjunto de botones de radio.

Es bastante com煤n generar los elementos de la interfaz manualmente, a帽adiendo opciones a una lista Web, por ejemplo, con c贸digo similar a este:

lista.Items.Add(new ListItem("Casado", "0");
lista.Items.Add(new ListItem("Soltero", "1");
etc...

Sin embargo ser铆a muy 煤til poder a帽adir autom谩ticamente los valores de una enumeraci贸n cualquiera sin preocuparse por saber cu谩ntas son o cu谩l es su nombre. Gracias al poder de la reflexi贸n en .NET esto es algo muy sencillo de conseguir.

Por ejemplo, la siguiente funci贸n toma como argumentos una referencia a un control de lista cualquiera de .NET (ListBox, CheckBoxList, DropDownList, etc...) y un valor enumerado cualquiera y rellena el control con tantas opciones como tenga disponibles dicha enumeraci贸n:

private void Enlaza(ListControl lst, Enum e)
{
聽string[] valores = Enum.GetNames(e.GetType());
聽foreach (string valor in valores)
聽聽lst.Items.Add(valor);
}

Toda la clave est谩 en el m茅todo GetNames del tipo Enum, que devuelve una matriz con los nombres de cada elemento de la enumeraci贸n indicada. As铆, para rellenar una lista s贸lo hay que escribir, por ejemplo:

Enlaza(miListBox, EstadoCivil.Casado);

o sea, se le pasa una referencia al control de lista y un miembro cualquiera de la enumeraci贸n.
F谩cil 驴verdad?

La anterior funci贸n es muy sencilla pero puede dar algunos problemas. Por ejemplo, si al definir la enumeraci贸n se han declarado algunos miembros con valores espec铆ficos y diferentes a los valores por defecto, entonces el orden en la lista no coincidir谩 con el valor de cada miembro (0, 1, 2...). Se puede arreglar, pero complica algo la funci贸n. El c贸digo definitivo es el siguiente:

private void Enlaza(ListControl lst, Enum e)
{
聽聽 Type tipo = Enum.GetUnderlyingType(e.GetType());
聽聽聽string[] nombres = Enum.GetNames(e.GetType());
聽聽聽Array valores = Enum.GetValues(e.GetType());
聽聽聽for(int i=0; i<nombres.Length;i++)
聽聽聽聽 lst.Items.Add(new ListItem(nombres[i], Convert.ChangeType(valores.GetValue(i), tipo).ToString() ) );
}

Con esto ya queda totalmente definido. Se convierte cada uno de los valores a su tipo subyacente (para obtener su valor num茅rico, no su nombre) y luego se convierte en una cadena para a帽adirlo al ListItem. Lo bueno de este c贸digo es que, aunque un poco m谩s complicado permite trabajar de forma gen茅rica con cualquier enumeraci贸n, sin importar su tipo o la cantidad de elementos que tenga.

Se puede retocar la funci贸n para que, si se desea, se a帽ada opcionalmente un elemento extra al principio o al final para permitir que el usuario escoja otra opci贸n (por ejemplo, "Otro", "Ninguno", "[Cualquiera]"... dependiendo del contexto).

💪🏻 驴Este post te ha ayudado?, 驴has aprendido algo nuevo?
Pues NO te pido que me invites a un caf茅... Te pido algo m谩s f谩cil y mucho mejor