2011-02-26 23 views
7

Attualmente sto sviluppando un'applicazione C#.Enum e caselle combinate in C#

Ho bisogno di usare un enum con una casella combinata per ottenere il mese selezionato. Ho il seguente per creare l'enumerazione:

enum Months 
{ 
    January = 1, 
    February, 
    March, 
    April, 
    May, 
    June, 
    July, 
    August, 
    September, 
    October, 
    November, 
    December 
}; 

Ho poi inizializzare il combobox utilizzando i seguenti:

cboMonthFrom.Items.AddRange(Enum.GetNames(typeof(Months))); 

Questo bit di codice funziona bene ma il problema è quando provo ad ottenere l'enum selezionato valore per il mese selezionato

per ottenere il valore della enumeratore dalla casella combinata ho usato il seguente:

private void cboMonthFrom_SelectedIndexChanged(object sender, EventArgs) 
{ 
    Months selectedMonth = (Months)cboMonthFrom.SelectedItem; 
    Console.WriteLine("Selected Month: " + (int)selectedMonth); 
} 

Tuttavia, quando provo a eseguire il codice sopra, viene visualizzato un errore che indica che si è verificata una prima eccezione di tipo System.InvalidCastException.

Quello che ho fatto di sbagliato.

Grazie per tutto l'aiuto che si può offrire

risposta

7

Prova questa

Months selectedMonth = (Months)Enum.Parse(typeof(Months), cboMonthFrom.SelectedItem.ToString()); 

invece di

Months selectedMonth = (Months)cboMonthFrom.SelectedItem; 

Aggiornato con le modifiche corrette

+0

eccellente che ha funzionato perfettamente. Grazie – Boardy

+0

Non è necessario inserire le stringhe nella casella combinata e quindi analizzarle nuovamente nei valori di 'Mesi'. Basta memorizzare i valori di 'Mesi' stessi. – Timwi

+0

Non è necessario memorizzare i valori stringa nella casella combinata e recuperarli come enumerazioni. È necessario aggiungere i valori enum come elementi della casella combinata OPPURE ottenerli come stringa e convertirli in enumerazione. Questo è il motivo per cui ho suggerito di fare quest'ultimo. – SadullahCeran

6

Il problema è che si sta popolando combobox con i nomi delle stringhe (Enum.GetNames restituisce string[]) e successivamente proverai a lanciarlo al tuo enum. Una possibile soluzione potrebbe essere:

Months selectedMonth = (Months)Enum.Parse(typeof(Months), cboMonthFrom.SelectedItem); 

Vorrei anche considerare l'utilizzo di informazioni mese esistente da Net invece di aggiungere il vostro enum:

var formatInfo = new System.Globalization.DateTimeFormatInfo(); 

var months = Enumerable.Range(1, 12).Select(n => formatInfo.MonthNames[n]); 
1

Hai memorizzato i nomi dei mesi nella casella combinata, non i valori int. Il tuo articolo selezionato sarà una stringa.

5

Prova

Months selectedMonth = 
    (Months) Enum.Parse(typeof(Months), cboMonthFrom.SelectedItem); 
3

Non c'è davvero alcun motivo per utilizzare Enum.GetNames a tutti. Perché archiviare le stringhe in ComboBox se si desidera effettivamente i mesi?

Basta usare Enum.GetValues invece:

foreach (var month in Enum.GetValues(typeof(Months))) 
    cboMonthFrom.Items.Add(month); 

[...] 

// This works now 
Months selectedMonth = (Months)cboMonthFrom.SelectedItem; 
+0

+1 per mettere valori reali in una casella combinata, ma vorrei usare 'AddRange' – Snowbear

+1

@Snowbear: già provato ... Il modo più breve per farlo è' combo.Items.AddRange (Enum.GetValues ​​(typeof (Months)) .Trasmetti il ​​numero () .ToArray()) ', che pensavo fosse inutilmente rotondeggiante. – Timwi

+1

Oh, pensavo che avrebbe funzionato senza 'ToArray()'. Odio quei metodi che hanno l'argomento 'Array' dove' IEnumerable' dovrebbe essere sufficiente. – Snowbear