ComboBox associato ai valori di un tipo enum pur avendo una voce "vuota"?
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.
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();