如何将枚举粘贴到.Net WinForm组合框中

如何将枚举粘贴到.Net WinForm组合框中,.net,winforms,reflection,enums,combobox,.net,Winforms,Reflection,Enums,Combobox,假设我有几个枚举代表。。。例如数据库供应商:Unknown,Oracle,Sybase,sqlserver2005,sqlserver2008,等等。我想让用户从组合框中选择所有这些,但选择一个Unknown。当用户选择一个枚举时,他们应该看到一个可读的描述(很可能来自属性)。但是,实际选择的对象应该是该特定类型的枚举 这可以在额外的字典的帮助下手动拼凑在一起,但我不想这样做,而是尽可能使用惯用和最干净的方式 您是否愿意分享一个代码示例,或者至少是一个好的链接 注意:除了未知(按照比尔·瓦格纳的

假设我有几个枚举代表。。。例如数据库供应商:
Unknown
Oracle
Sybase
sqlserver2005
sqlserver2008
,等等。我想让用户从组合框中选择所有这些,但选择一个
Unknown
。当用户选择一个枚举时,他们应该看到一个可读的描述(很可能来自属性)。但是,实际选择的对象应该是该特定类型的枚举

这可以在额外的字典的帮助下手动拼凑在一起,但我不想这样做,而是尽可能使用惯用和最干净的方式

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

注意:除了
未知
(按照比尔·瓦格纳的规定,短/int值为
0
)之外,是否有一种简单的方法可以获取供应商类型的所有枚举的集合

另外,是否有一种简单的方法可以获取除Unknown(按照Bill Wagner的规定,其short/int值为0)之外的供应商类型的所有枚举的集合

注意:如果应用程序需要本地化,那么
Description
属性可能不是最佳选项。相反,您可以使用名为
DisplayName\u DbVendor\u Oracle
DisplayName\u DbVendor\u SqlServer
等的字符串资源。然后,您可以按如下方式检索值的显示名:

DbVendor vendor = ...;
string displayName = Properties.Resources.ResourceManager.GetString("DisplayName_DbVendor_" + vendor);
DbVendor[] values = Enum.GetValues(typeof(DbVendor))
                        .Cast<DbVendor>()
                        .Where(v => v != DbVendor.Unknown)
                        .OrderBy(v => v.GetDescription())
                        .ToArray();

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

DbVendor vendor = ...;
string displayName = Properties.Resources.ResourceManager.GetString("DisplayName_DbVendor_" + vendor);
DbVendor[] values = Enum.GetValues(typeof(DbVendor))
                        .Cast<DbVendor>()
                        .Where(v => v != DbVendor.Unknown)
                        .OrderBy(v => v.GetDescription())
                        .ToArray();
DbVendor[]values=Enum.GetValues(typeof(DbVendor))
.Cast()
.Where(v=>v!=DbVendor.Unknown)
.OrderBy(v=>v.GetDescription())
.ToArray();
另外,是否有一种简单的方法可以获取除Unknown(按照Bill Wagner的规定,其short/int值为0)之外的供应商类型的所有枚举的集合

注意:如果应用程序需要本地化,那么
Description
属性可能不是最佳选项。相反,您可以使用名为
DisplayName\u DbVendor\u Oracle
DisplayName\u DbVendor\u SqlServer
等的字符串资源。然后,您可以按如下方式检索值的显示名:

DbVendor vendor = ...;
string displayName = Properties.Resources.ResourceManager.GetString("DisplayName_DbVendor_" + vendor);
DbVendor[] values = Enum.GetValues(typeof(DbVendor))
                        .Cast<DbVendor>()
                        .Where(v => v != DbVendor.Unknown)
                        .OrderBy(v => v.GetDescription())
                        .ToArray();

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

DbVendor vendor = ...;
string displayName = Properties.Resources.ResourceManager.GetString("DisplayName_DbVendor_" + vendor);
DbVendor[] values = Enum.GetValues(typeof(DbVendor))
                        .Cast<DbVendor>()
                        .Where(v => v != DbVendor.Unknown)
                        .OrderBy(v => v.GetDescription())
                        .ToArray();
DbVendor[]values=Enum.GetValues(typeof(DbVendor))
.Cast()
.Where(v=>v!=DbVendor.Unknown)
.OrderBy(v=>v.GetDescription())
.ToArray();
一些后续问题:A)在运行时将枚举的
IEnumerable
输入WinForm组合框之前,是否需要将其具体化为数组?B) 在对这些项目进行排序时,枚举列表是否会保持声明顺序?如果我想按照描述进行显式排序,那么我需要如何修改LINQ查询?A)我不确定如果您直接将IEnumerable分配给数据源,它将如何工作。。。我通常使用ToArray或ToList来确保查询只执行一次。B) 请参阅我的编辑一些后续内容:A)在运行时将枚举的
IEnumerable
输入WinForm组合框之前,是否需要将其具体化为数组?B) 在对这些项目进行排序时,枚举列表是否会保持声明顺序?如果我想按照描述进行显式排序,那么我需要如何修改LINQ查询?A)我不确定如果您直接将IEnumerable分配给数据源,它将如何工作。。。我通常使用ToArray或ToList来确保查询只执行一次。B) 请参阅我的编辑可能的副本可能的副本