Domanda

Se associo un ComboBox WinForms ai valori di un tipo enum, ad esempio

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

Chissà come potrei ottenere lo stesso risultato, mentre, oltre alle voci corrispondenti a ciascun valore enum, posso anche avere una voce vuota che non rappresenta alcuna selezione?

Non posso semplicemente aggiungere un valore speciale al tipo di enum perché questo deve essere flessibile per gestire qualsiasi tipo di enum.

Gradirei il tuo aiuto.

Modifica: Dovrei chiarire che voglio associare i valori enum effettivi e non i loro nomi. Se i valori enum effettivi sono associati, ComboBox si occupa di chiamare ToString () per ottenere il testo da visualizzare.

È stato utile?

Soluzione 3

(Vedi la mia modifica alla domanda in cui ho chiarito che non voglio legarmi a una raccolta di stringhe).

Dopo altri violini, la seguente mostruosità sembra funzionare. combo1.SelectedItem è di tipo object e sarà un valore enum DBNull o (boxed?). È consigliabile questo codice?

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

Modifica: vedo che i metodi di Adam e Andrew potrebbero essere facilmente adattati per fare la stessa cosa. Grazie ragazzi!

Altri suggerimenti

Non sono sicuro se voi ragazzi avete provato tutto il codice che avete pubblicato o no, ma non potete aggiungere elementi facendo un ComboBox databound. Questo è winforms, non WPF, quindi non c'è "DataBind" la funzione.

Puoi farlo:

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();
}

Poi

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

Potresti provare qualcosa del genere:

( Modificato per riflettere l'eccellente suggerimento di 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);
}

Questo ti permetterà di associare i risultati di questa funzione in questo modo:

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

o in questo modo, se si desidera specificare un valore diverso per l'elemento iniziale:

combo1.DataSource = getValues<myEnumType>("Select").ToArray();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top