2011-02-26 86 views
7

我目前正在開發一個C#應用程序。C中的枚舉和組合框#

我需要使用帶組合框的枚舉來獲取選定的月份。我有以下創建枚舉:

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

我然後使用初始化組合框以下:

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

這段代碼工作正常,但問題是,當我試圖讓所選擇的枚舉所選月份

值來獲取值從我使用了下列組合框枚舉:

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

但是,當我嘗試運行上面的代碼時,它出現了一個錯誤,指出發生了System.InvalidCastException類型的第一次機會異常。

我做錯了什麼。

感謝您的幫助,您可以提供

回答

7

Months selectedMonth = (Months)cboMonthFrom.SelectedItem; 

更新了正確的改變

+0

優秀,完美的工作。謝謝 – Boardy 2011-02-26 20:06:48

+0

沒有必要將字符串放入組合框,然後將它們解析回'Months'值。只需存儲'Months'值。 – Timwi 2013-12-16 07:14:38

+0

您不應該將字符串值存儲到組合框並將其作爲枚舉檢索。你必須添加枚舉值作爲組合框項目或讓他們作爲字符串和轉換爲枚舉。這就是爲什麼我建議去做後者。 – SadullahCeran 2014-07-19 16:09:51

6

的問題,而不是嘗試這種

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

是,你填充組合框用字符串名稱(Enum.GetNames返回string[]),稍後嘗試將其轉換爲枚舉。一個可能的解決方案是:

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

我也會考慮利用現有的.Net每月信息,而不是增加您的枚舉:

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

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

你存儲在組合框中月份的名字,不是int值。您選擇的項目將是一個字符串。

5

嘗試

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

實在是沒有理由使用Enum.GetNames可言。爲什麼要在ComboBox中存儲字符串?

只需使用Enum.GetValues代替:

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

[...] 

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

+1將實際值放到組合框中,但我會使用'AddRange' – Snowbear 2011-02-28 07:11:38

+1

@Snowbear:已經嘗試過了......最簡單的方法是'combo.Items.AddRange(Enum.GetValues(typeof(Months)) 。演員().ToArray())',我認爲這是不必要的迂迴。 – Timwi 2011-02-28 10:59:05

+1

噢,我認爲沒有'ToArray()'就可以工作。討厭那些'Array'參數的方法,IEnumerable'應該足夠了。 – Snowbear 2011-02-28 11:10:07