gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:42:57 25 4
gpt4 key购买 nike

我阅读了很多关于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com