我正在使用第三方DLL,它需要方法簽名中名爲'DaysOfWeek'的枚舉。將字符串與枚舉匹配?
我允許我的用戶從ComboBox中選擇星期幾,但我最終得到一個字符串。
我怎樣才能匹配我的字符串適當的枚舉屬性?
謝謝!
我正在使用第三方DLL,它需要方法簽名中名爲'DaysOfWeek'的枚舉。將字符串與枚舉匹配?
我允許我的用戶從ComboBox中選擇星期幾,但我最終得到一個字符串。
我怎樣才能匹配我的字符串適當的枚舉屬性?
謝謝!
Enum.Parse(typeof(DaysOfWeek), yourStringValue, true);
注意:如果字符串不能轉換爲枚舉,將會發生異常。最後一個參數用於不區分大小寫的搜索。
+1增加了異常信息和最後的參數信息 – gbianchi 2009-12-22 17:20:22
您可以使用Enum.Parse將字符串轉換爲實際的枚舉。
您可以使用下面的字符串轉換爲一個枚舉:
DaysOfWeek value = (DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), enumAsString);
您還可以使用不區分大小寫的過載,如果用戶可以輸入在理論值自己的價值觀:
DaysOfWeek value = (DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), enumAsString, true);
您可以對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;
假設組合框包含枚舉名稱。
ComboBox cb = new ComboBox();
cb.Items.AddRange(Enum.GetNames(typeof(DaysOfWeek));
(DaysOfWeek)Enum.Parse(typeof(DaysOfWeek), cb.SelectedText);
創建一個類,它看起來是這樣的:
public class DayOfWeekComboBoxItem
{
public string Day{get;set;}
public DayOfWeek DayOfWeek{get;set;}
public override ToString()
{
return this.Date;
}
}
然後組合框綁定到這些項目的集合。然後,您可以將組合框中的SelectedItem轉換爲該類的一個實例。
對不起,我在這裏有一個助手類,叫EnumPair<T>
你可以用來填充ComboBox並讓枚舉的值可以繼續使用。使用
這三條線路將正確填寫下拉框中爲您提供:
cbo.DataSource = EnumPair<TEnum>.GetValuePairList();
cbo.ValueMember = EnumPair<TEnum>.ValueMember;
cbo.DisplayMember = EnumPair<TEnum>.DisplayMember;
原來這裏是posting
如果您是從DaysOfWeek枚舉填充你的組合框:
this.comboBox1.DataSource = Enum.GetValues(typeof(DayOfWeek));
然後,您可以從ComboBox的SelectedItem屬性中獲取枚舉值:
DayOfWeek selected = (DayOfWeek)this.comboBox1.SelectedItem;
除此之外,還有一個有趣的第三方Enum<T>
類,能使與枚舉工作更加漂亮:
http://blog.logrythmik.com/post/Better-Enum-Parsing-using-Strongly-Typed-Generics.aspx
您可以綁定到一個名稱/值對列表,其中值是您的枚舉。 稍微多一點工作,但如果您需要,可以更輕鬆地支持本地化。這裏有一種方法:
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;
這裏是我寧願。如果解析失敗,則需要處理。
// 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
}
你有什麼試過的?有些解決方案可能比其他解決方案更優雅,但這似乎是將一個映射到另一個的簡單問題。 – 2009-12-22 17:16:56