代码之家  ›  专栏  ›  技术社区  ›  Hamish Grubijan

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

  •  0
  • Hamish Grubijan  · 技术社区  · 14 年前

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

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

    请分享一个代码示例,或者至少一个好的链接?

    P.S.是否有一个简单的方法来获取类型供应商的所有枚举的集合,除了 未知 (其short/int值为 0 如比尔·瓦格纳所述?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Community CDub    7 年前

    P.S.是否有一种简单的方法来获取类型供应商的所有枚举的集合,但未知的除外(其short/int值将为0,如bill wagner所规定)?

    DbVendor[] values = Enum.GetValues(typeof(DbVendor))
                            .Cast<DbVendor>()
                            .Where(v => v != DbVendor.Unknown)
                            .ToArray();
    

    要将友好名称与值关联,可以使用 DescriptionAttribute ,如图所示 this answer . 处理 Format 事件 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 等。然后您可以按如下方式检索值的显示名称:

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

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

    DbVendor[] values = Enum.GetValues(typeof(DbVendor))
                            .Cast<DbVendor>()
                            .Where(v => v != DbVendor.Unknown)
                            .OrderBy(v => v.GetDescription())
                            .ToArray();