假设我有几个枚举代表......例如数据库供应商:Unknown
,Oracle
,Sybase
,SQL Server 2005
,SQL Server 2008
等。想让用户在所有这些选项中进行选择,但是从组合框中选择Unknown
。当用户选择枚举时,他们应该看到一个人类可读的描述(希望它来自一个属性)。但是,选择的实际对象应该是该特定类型的枚举。
这可以在额外字典的帮助下手动攻击,但我不想这样做,而是使用惯用的和最干净的方式。
您是否愿意分享代码示例,或者至少是一个好的链接?
P.S。是否有一种简单的方法可以获取类型供应商的所有枚举的集合,但Unknown
除外(根据Bill Wagner的规定,它将具有0
的short / int值)?
答案 0 :(得分:4)
P.S。有没有一种简单的方法可以获取类型供应商的所有枚举的集合,除了Unknown(根据Bill Wagner的规定,其short / int值为0)?
DbVendor[] values = Enum.GetValues(typeof(DbVendor))
.Cast<DbVendor>()
.Where(v => v != DbVendor.Unknown)
.ToArray();
要将友好名称与值相关联,您可以使用DescriptionAttribute
,如this answer所示。处理Format
的{{1}}事件以显示说明:
ComboBox
注意:如果您的应用程序需要可本地化,private void comboBoxVendor_Format(object sender, ListControlConvertEventArgs e)
{
DbVendor vendor = (DbVendor)e.ListItem;
e.Value = vendor.GetDescription();
}
属性可能不是最佳选择。相反,您可以使用名称为Description
,DisplayName_DbVendor_Oracle
等的字符串资源。然后,您可以按如下方式检索值的显示名称:
DisplayName_DbVendor_SqlServer
编辑:如果您需要按描述对值进行排序,只需按如下方式更改LINQ查询:
DbVendor vendor = ...;
string displayName = Properties.Resources.ResourceManager.GetString("DisplayName_DbVendor_" + vendor);