c# - 通过 ValueMember 为类的枚举属性选择 ComboBox

标签 c# winforms combobox enums selectedvalue

我阅读了很多关于 Winforms ComboBox ValueMember 属性主题的有用帖子,但没有一篇能回答我的具体问题。首先,我将描述一个工作正常的简单示例,然后我将描述我想如何改变它,并询问如何做到这一点(我也会提供我的一种尝试)。

首先,工作示例。只是一个带有组合框控件的表单,以及这段代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        comboBox1.DataSource = Enum.GetValues(typeof(Enum1));
        comboBox1.SelectedItem = Enum1.MultiWordValue2;
    }
}

public enum Enum1 : int
{
    Undefined,
    MultiWordValue1,
    MultiWordValue2
}

没问题,这很好用。我运行应用程序,组合框获取适当的项目,并选择适当的值。

但是,这些枚举值很难看,我希望我的用户有更好的体验,所以我创建了一个扩展方法来更好地显示这些值。

public static class ExtensionMethods
{
    public static string ToDisplayString(this Enum1 me)
    {
        switch (me)
        {
            case Enum1.MultiWordValue1:
                return "Multi Word Value 1";
            case Enum1.MultiWordValue2:
                return "Multi Word Value 2";
            default:
                return string.Empty;
        }
    }
}

我的问题是,如何最好地利用此扩展方法,同时保留从枚举值列表构建组合框项目的能力,并能够通过枚举值设置选定的组合框项目(或值)?

下面是我的第一次尝试。我创建了一个简单的类来包装枚举值和显示字符串,并将组合框 DisplayMember 和 ValueMember 设置为新类的属性。这部分有效;组合框的项目使用显示值正确填充,但我无法设置 SelectedValue:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        comboBox1.DisplayMember = "Display";
        comboBox1.ValueMember = "Value";
        foreach (Enum1 e in Enum.GetValues(typeof(Enum1)))
            comboBox1.Items.Add(new ValueDisplayEnum(e, e.ToDisplayString()));
        comboBox1.SelectedValue = Enum1.MultiWordValue2;
    }
}

public enum Enum1 : int
{
    Undefined,
    MultiWordValue1,
    MultiWordValue2
}

public static class ExtensionMethods
{
    public static string ToDisplayString(this Enum1 me)
    {
        switch (me)
        {
            case Enum1.MultiWordValue1:
                return "Multi Word Value 1";
            case Enum1.MultiWordValue2:
                return "Multi Word Value 2";
            default:
                return string.Empty;
        }
    }
}

public class ValueDisplayEnum
{
    public object Value { get; set; }
    public string Display { get; set; }
    private ValueDisplayEnum() { }
    public ValueDisplayEnum(object _Value, string _Display)
    {
        Value = _Value;
        Display = _Display;
    }
}

为什么以这种方式设置 SelectedValue 不起作用?以及如何完成具有更好显示字符串的枚举组合框?

旁白:我认为这可能是因为 ValueDisplayEnum 的 Value 属性的基础数据类型是一个对象,而不是 Enum1。但是,如果我将类型更改为 Enum1,SelectedValue 仍然没有正确设置。

感谢您的帮助!

编辑 1:根据 Mike 的建议指定一个解决方案:

添加了以下模板化方法:

public static void SetEnumCombo<T>(ComboBox _ComboBox, T _Value)
{
    foreach (ValueDisplayEnum vde in _ComboBox.Items)
        if (((T)vde.Value).Equals(_Value))
            _ComboBox.SelectedItem = vde;
}

不是直接分配 SelectedValue 或 SelectedItem,而是这样调用:

foreach (Enum1 e in Enum.GetValues(typeof(Enum1)))
    comboBox1.Items.Add(new ValueDisplayEnum(e, e.ToDisplayString()));
SetEnumCombo(comboBox1, Enum1.MultiWordValue2);

一切都很顺利。我仍然不确定为什么按值设置不起作用,但这是解决问题的非常紧凑的方法。但不如标记为答案的响应那么紧凑!

最佳答案

在您的第一次尝试中,您可以选择所需的项目:

comboBox1.SelectedItem = comboBox1.Items.Cast<ValueDisplayEnum>().First(x => (Enum1)x.Value == Enum1.MultiWordValue2);

关于c# - 通过 ValueMember 为类的枚举属性选择 ComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16419876/

相关文章:

C# 堆栈溢出异常

c# - 可编辑的 ComboBox 绑定(bind)和更新源触发器

c# - 如何创建组合框以在用户在 C# 的组合框中键入拼写时自动填充

c# - 不活动后出现故障的 WCF 双工回调 - 使长时间运行的推送通知保持事件状态

c# - 使用 ASP.NET 2.0/C# 处理错误报告方法

c# - FFmpeg 文件转换格式和文件扩展名

c# - 将音频输入转换为时间并使用C#显示

c# - WinForms 和事件处理程序

c# - 如何在运行时在 WinForm 中添加按钮?

c# - 在 Winform 的组合框中获取旧的选定索引