我正在使用第三方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