ComboBox vinculado a valores de um tipo enum tendo também uma entrada “em branco”?
Pergunta
Se eu ligar um WinForms ComboBox com os valores de um tipo enum, i.
combo1.DropDownStyle = ComboBoxStyle.DropDownList;
combo1.DataSource = Enum.GetValues(typeof(myEnumType));
Quem sabe como eu poderia conseguir o mesmo resultado, enquanto que, para além de entradas correspondentes a cada valor enum, eu também pode ter uma entrada em branco representando nenhuma seleção?
Eu não posso simplesmente adicionar um valor especial para o tipo de enumeração porque este deve ser flexível para lidar com qualquer tipo de enumeração.
Eu aprecio sua ajuda.
Editar: eu deveria deixar claro que eu quero vincular os valores enum reais e não os seus nomes. Se os valores enum reais são obrigados, a caixa de combinação cuida de chamar sua ToString () para obter o texto para exibição.
Solução 3
(veja por favor minha edição para a pergunta onde eu esclarecer que eu não quero vincular a uma coleção de cordas).
Depois de mais mexer, o seguinte monstruosidade parece trabalho. combo1.SelectedItem é do tipo de objecto e será ou um DBNull ou um (box?) valor enum. É este aconselhável código?
combo1.DataSource = (new object[] { DBNull.Value }
.Concat(Enum.GetValues(refToAnEnumType)
.Cast<object>())).ToList()
Editar: Eu vejo Adam e métodos de Andrew poderia ser facilmente adaptado para fazer a mesma coisa. Obrigado rapazes!
Outras dicas
Não sei se vocês já tentou todo o código que você foi publicar ou não, mas você não pode adicionar itens de fazer uma caixa de combinação de ligação de dados. Esta é winforms, não WPF, então não há nenhuma função "DataBind".
Você pode fazer isso:
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();
}
Em seguida
combo.DataSource = GetEnumValues<myEnumType>(true);
Você poderia tentar algo como isto:
( editada para refletir excelente sugestão 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);
}
Isto irá permitir que você se ligam aos resultados desta função como esta:
combo1.DataSource = getValues<myEnumType>().ToArray();
ou assim, se você deseja especificar um valor diferente para o item inicial:
combo1.DataSource = getValues<myEnumType>("Select").ToArray();