2009-12-22 267 views
4

我正在使用第三方DLL,它需要方法簽名中名爲'DaysOfWeek'的枚舉。將字符串與枚舉匹配?

我允許我的用戶從ComboBox中選擇星期幾,但我最終得到一個字符串。

我怎樣才能匹配我的字符串適當的枚舉屬性?

謝謝!

+0

你有什麼試過的?有些解決方案可能比其他解決方案更優雅,但這似乎是將一個映射到另一個的簡單問題。 – 2009-12-22 17:16:56

回答

39
Enum.Parse(typeof(DaysOfWeek), yourStringValue, true); 

注意:如果字符串不能轉換爲枚舉,將會發生異常。最後一個參數用於不區分大小寫的搜索。

+4

+1增加了異常信息和最後的參數信息 – gbianchi 2009-12-22 17:20:22

1

您可以使用Enum.Parse將字符串轉換爲實際的枚舉。

16

您可以使用下面的字符串轉換爲一個枚舉:

DaysOfWeek value = (DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), enumAsString); 

您還可以使用不區分大小寫的過載,如果用戶可以輸入在理論值自己的價值觀:

DaysOfWeek value = (DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), enumAsString, true); 
+0

我知道你只是做了第二部分作爲如何做到這一點的一個例子,但爲什麼你會需要用戶輸入枚舉類型的值,如果你可以做一個下拉式即時驗證? – PAULDAWG 2013-05-10 17:04:10

+0

也許在你不是從組合框驅動它的情況下,但可能來自命令行參數。我很感激這不是提出的具體問題,但這些信息對我來說確實有用! – steeveeet 2015-04-08 11:03:19

1

您可以對Enum靜態類型使用Parse方法。

DaysOfWeek day = (DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), (string)dropDownList.SelectedItem); 

或者,您可以直接使用枚舉值填充下拉列表,並完全避免轉換問題。

// Populate combobox. 
    foreach (DaysOfWeek day in Enum.GetValues(typeof(DaysOfWeek))) 
    { 
     daysOfWeekCombo.Items.Add(day); 
    } 
    // Read combobox. 
    DaysOfWeek day = (DaysOfWeek)daysOfWeekCombo.SelectedItem; 
3

假設組合框包含枚舉名稱。

ComboBox cb = new ComboBox(); 

cb.Items.AddRange(Enum.GetNames(typeof(DaysOfWeek)); 

(DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), cb.SelectedText); 
1

創建一個類,它看起來是這樣的:

public class DayOfWeekComboBoxItem 
{ 
    public string Day{get;set;} 
    public DayOfWeek DayOfWeek{get;set;} 

    public override ToString() 
    { 
     return this.Date; 
    } 
} 

然後組合框綁定到這些項目的集合。然後,您可以將組合框中的SelectedItem轉換爲該類的一個實例。

2

對不起,我在這裏有一個助手類,叫EnumPair<T> 你可以用來填充ComboBox並讓枚舉的值可以繼續使用。使用

這三條線路將正確填寫下拉框中爲您提供:

cbo.DataSource = EnumPair<TEnum>.GetValuePairList(); 
cbo.ValueMember = EnumPair<TEnum>.ValueMember; 
cbo.DisplayMember = EnumPair<TEnum>.DisplayMember; 

原來這裏是posting

0

如果您是從DaysOfWeek枚舉填充你的組合框:

this.comboBox1.DataSource = Enum.GetValues(typeof(DayOfWeek)); 

然後,您可以從ComboBox的SelectedItem屬性中獲取枚舉值:

DayOfWeek selected = (DayOfWeek)this.comboBox1.SelectedItem; 
0

您可以綁定到一個名稱/值對列表,其中值是您的枚舉。 稍微多一點工作,但如果您需要,可以更輕鬆地支持本地化。這裏有一種方法:

static IList<KeyValuePair<string, DayOfWeek>> GetDayOfWeekBindingList() 
{ 
    List<KeyValuePair<string, DayOfWeek>> dayOfWeekList = new List<KeyValuePair<string, DayOfWeek>>(); 

    foreach (int day in Enum.GetValues(typeof(DayOfWeek))) 
    { 
     string dayName = CultureInfo.CurrentCulture.DateTimeFormat.DayNames[day]; 
     dayOfWeekList.Add(new KeyValuePair<string, DayOfWeek>(dayName, (DayOfWeek)day)); 
    } 
    return dayOfWeekList; 
} 

private void BindDayOfWeekComboBox() 
{ 
    dayOfWeekComboBox.DisplayMember = "Key"; 
    dayOfWeekComboBox.ValueMember = "Value"; 
    dayOfWeekComboBox.DataSource = GetDayOfWeekBindingList(); 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    BindDayOfWeekComboBox(); 
    ... 
} 

然後,您可以訪問一週的一天:

(DayOfWeek) dayOfWeekComboBox.SelectedValue; 
0

這裏是我寧願。如果解析失敗,則需要處理。

// this will hold parsed value 
DaysOfWeek daySelected; 

// 'toMatch' is the string to be parsed or checked 

if (Enum.TryParse(toMatch, out daySelected) && Enum.IsDefined(typeof(DaysOfWeek), daySelected)) 
{ 
    // parsed success, use 'daySelected' 

} 
else 
{ 
    // parsed failed 

}