如何将枚举粘贴到.Net WinForm ComboBox中

时间:2010-11-20 21:26:10

标签: .net winforms reflection enums combobox

假设我有几个枚举代表......例如数据库供应商:UnknownOracleSybaseSQL Server 2005SQL Server 2008等。想让用户在所有这些选项中进行选择,但是从组合框中选择Unknown。当用户选择枚举时,他们应该看到一个人类可读的描述(希望它来自一个属性)。但是,选择的实际对象应该是该特定类型的枚举。

这可以在额外字典的帮助下手动攻击,但我不想这样做,而是使用惯用的和最干净的方式。

您是否愿意分享代码示例,或者至少是一个好的链接?

P.S。是否有一种简单的方法可以获取类型供应商的所有枚举的集合,但Unknown除外(根据Bill Wagner的规定,它将具有0的short / int值)?

1 个答案:

答案 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(); } 属性可能不是最佳选择。相反,您可以使用名称为DescriptionDisplayName_DbVendor_Oracle等的字符串资源。然后,您可以按如下方式检索值的显示名称:

DisplayName_DbVendor_SqlServer

编辑:如果您需要按描述对值进行排序,只需按如下方式更改LINQ查询:

DbVendor vendor = ...;
string displayName = Properties.Resources.ResourceManager.GetString("DisplayName_DbVendor_" + vendor);