2009-12-22 82 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 

}