2011-02-26 14 views
7

Aktualnie pracuję nad aplikacją C#.Wyliczenia i pola kombi w języku C#

Potrzebuję użyć wyliczenia z polem kombi, aby uzyskać wybrany miesiąc. Mam następujący stworzyć ENUM:

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

I wtedy inicjalizacja combobox przy użyciu następujących:

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

Ten fragment kodu działa w porządku, jednak problem jest gdy próbuję dostać wybrany enum wartość dla wybranego miesiąca

uzyskać wartość numeratora z pola kombi Użyłem następujący:

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

Jednak, gdy próbuję uruchomić powyższy kod, pojawia się komunikat o błędzie: Wystąpił wyjątek pierwszej szansy typu System.InvalidCastException.

Co zrobiłem źle.

Dzięki za wszelką pomoc można zapewnić

Odpowiedz

7

Spróbuj

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

zamiast

Months selectedMonth = (Months)cboMonthFrom.SelectedItem; 

Aktualizacja z odpowiednimi zmianami

+0

Doskonała że pracował idealnie. Dziękuję – Boardy

+0

Nie jest konieczne umieszczanie ciągów znaków w polu kombi, a następnie przetwarzanie ich z powrotem do wartości 'Months'. Po prostu przechowuj wartości 'Months'. – Timwi

+0

Nie należy przechowywać wartości łańcuchów w polu kombi i pobierać ich jako wyliczenia. Musisz dodać wartości wyliczeniowe jako element pola kombi LUB uzyskać je jako ciąg i przekonwertować do wyliczenia. Dlatego zasugerowałem zrobienie tego drugiego. – SadullahCeran

6

Kwestia jest taka, że ​​jesteś wypełniania combobox z nazwami łańcuchów (Enum.GetNames zwraca string[]), a później spróbujesz rzucić go do swojego wyliczenia. Jednym z możliwych rozwiązań może być:

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

Chciałbym również rozważyć wykorzystanie istniejących informacji miesiąca od .NET zamiast dodawania ENUM:

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

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

pan przechowywane nazwy miesięcy w combobox, nie wartości int. Twój wybrany element będzie ciągiem.

5

Spróbuj

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

Naprawdę nie ma powodów, by używać Enum.GetNames w ogóle. Po co zapisywać ciągi w ComboBox, jeśli faktycznie chcesz mieć miesiące?

Wystarczy użyć Enum.GetValues zamiast:

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

[...] 

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

+1 za wstawienie rzeczywistych wartości do combobox, ale użyłbym 'AddRange' – Snowbear

+1

@Snowbear: Już wypróbowałem ... Najkrótszym sposobem na to jest' combo.Items.AddRange (Enum.GetValues ​​(typeof (Months)) .Rzuć () .ToArray()) ', które uważałem za niepotrzebnie okrężne. – Timwi

+1

Och, myślałem, że to zadziała bez 'ToArray()'. Nienawidź tych metod z argumentem 'Array', w którym powinno wystarczyć' IEnumerable'. – Snowbear

Powiązane problemy