ComboBox enlazado a los valores de un tipo de enumeración mientras que también tiene un & # 8220; blank & # 8221; ¿entrada?

StackOverflow https://stackoverflow.com/questions/807030

Pregunta

Si vinculo un WinForms ComboBox a los valores de un tipo de enumeración, es decir,

combo1.DropDownStyle = ComboBoxStyle.DropDownList;
combo1.DataSource = Enum.GetValues(typeof(myEnumType));

¿Quién sabe cómo podría lograr el mismo resultado, mientras que, además de las entradas que coinciden con cada valor de enumeración, también puedo tener una entrada en blanco que no representa ninguna selección?

No puedo simplemente agregar un valor especial al tipo de enumeración porque debe ser flexible para tratar con cualquier tipo de enumeración.

Agradecería su ayuda.

Editar: Debería dejar claro que quiero enlazar los valores de enumeración reales y no sus nombres. Si los valores de enumeración reales están vinculados, ComboBox se encarga de llamar a su ToString () para que se muestre el texto.

¿Fue útil?

Solución 3

(Consulte mi edición de la pregunta en la que aclaré que no quiero vincularme a una colección de cadenas).

Después de más retoques, la siguiente monstruosidad parece funcionar. combo1.SelectedItem es de tipo objeto y será un DBNull o un valor de enumeración (¿en caja?). ¿Es recomendable este código?

combo1.DataSource = (new object[] { DBNull.Value }
                        .Concat(Enum.GetValues(refToAnEnumType)
                            .Cast<object>())).ToList()

Editar: veo que los métodos de Adam y Andrew podrían adaptarse fácilmente para hacer lo mismo. Gracias chicos!

Otros consejos

No estoy seguro de si ustedes han intentado todo el código que han estado publicando o no, pero no pueden agregar elementos a un ComboBox enlazado a datos. Esto es winforms, no WPF, por lo que no hay " DataBind " función.

Podrías hacer esto:

public static string[] GetEnumValues<T>(bool includeBlank) 
{
    List<string> values = new List<string>((Enum.GetValues(typeof(T)) as T[]).Select(t => t.ToString()));

    if (includeBlank)
    {
        values.Insert(0, string.Empty);
    }

    return values.ToArray();
}

entonces

combo.DataSource = GetEnumValues<myEnumType>(true);

Puedes intentar algo como esto:

( Editado para reflejar la excelente sugerencia de Brad_Z )

static IEnumerable<String> getValues<T>(String initialValue)
{
    yield return initialValue;

    foreach (T t in Enum.GetValues(typeof(T)))
        yield return t.ToString();
}

static IEnumerable<String> getValues<T>()
{
    return getValues<T>(String.Empty);
}

Esto le permitirá vincularse a los resultados de esta función de esta manera:

combo1.DataSource = getValues<myEnumType>().ToArray();

o como este, si desea especificar un valor diferente para el elemento inicial:

combo1.DataSource = getValues<myEnumType>("Select").ToArray();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top