簡體   English   中英

C# 中的枚舉和組合框

[英]Enums and ComboBoxes in C#

我目前正在開發一個 C# 應用程序。

我需要使用帶有 ComboBox 的 Enum 來獲取所選月份。 我有以下內容來創建枚舉:

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

然后我使用以下方法初始化 ComboBox:

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

這段代碼工作正常,但問題是當我嘗試獲取所選月份的所選 Enum 值時。

為了從 ComboBox 中獲取 Enum 值,我使用了以下內容:

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

但是,當我嘗試運行上面的代碼時,它出現了一個錯誤,說A first chance exception of type 'System.InvalidCastException' occurred

我做錯了什么。

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

嘗試這個

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

代替

Months selectedMonth = (Months)cboMonthFrom.SelectedItem;

更新了正確的更改

問題是您正在使用字符串名稱填充組合框( 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]);

嘗試

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

根本沒有理由使用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;

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

這是我的單行解決方案:

comboBox1.DataSource = Enum.GetValues( typeof( DragDropEffects ) );

這將為您提供所選項目:

DragDropEffects 效果 = ( DragDropEffects ) comboBox1.SelectedItem;

注意:您可以使用任何您喜歡的 Enum,包括您自己的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM