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.

Foi útil?

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top