【发布时间】:2011-10-18 17:52:00
【问题描述】:
我有一个这样的枚举:
public enum Cities
{
[Description("New York City")]
NewYork,
[Description("Los Angeles")]
LosAngeles,
Washington,
[Description("San Antonio")]
SanAntonio,
Chicago
}
我想将它绑定到一个组合框,我已经尝试过了:
comboBox.DataSource = Enum.GetNames(typeof(Cities));
但这会在组合框中显示值而不是字符串描述。所以我切换到这个:
public static string GetEnumDescription(Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes != null && attributes.Length > 0)
{
return attributes[0].Description;
}
else
{
return value.ToString();
}
}
public static IList ToList(this Type type)
{
ArrayList list = new ArrayList();
Array enumValues = Enum.GetValues(type);
foreach (Enum value in enumValues)
{
list.Add(new KeyValuePair<Enum, string>(value, GetEnumDescription(value)));
}
return list;
}
现在 list.Add() 调用会产生值,它的字符串描述显示在组合框中,所以我替换了
list.Add(new KeyValuePair<Enum, string>(value, GetEnumDescription(value)));
与
list.Add(GetEnumDescription(value));
现在我得到的只是组合框中显示的描述性字符串,这是我最终想要的。现在我的数据绑定被破坏了,因为它无法在枚举中找到字符串描述。我认为这可能与 combobox.DisplayMember 和 combobox.ValueMember 有关,但我还没有解决这个问题。谁能告诉我如何显示描述性字符串但让我的数据绑定使用该值进行存储等?谢谢!!!
【问题讨论】:
-
只是出于好奇..为什么要为此使用枚举?
-
我需要显示几个包含不同固定选项的组合框供我的用户选择。也许有一个组合框可以显示四种颜色(红、黄、绿、蓝)。另一个可能会显示一个形状列表供他们选择。由于这些是固定列表,我认为枚举是有意义的。我有一个“数据”类来模拟所有这些东西,当用户在 UI 中完成选择后,我只需解析数据对象的属性并将值保存到文件中。这能回答你的问题吗?
-
是的,它会按照你的方式正常工作,只是让代码变得更棘手。既然这是一个硬编码列表,那么在运行时实例化一个硬编码列表作为替代方案会有什么缺点?
-
我认为这不会有任何缺点。我只是试图让我的数据类中的所有内容都保持整洁,并在此过程中了解有关枚举和数据绑定的更多信息。 :-)
标签: .net winforms data-binding combobox enumeration