ComboBox enlazado a los valores de un tipo de enumeración mientras que también tiene un & # 8220; blank & # 8221; ¿entrada?
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.
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();