我已经阅读了很多关于 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
}
没问题,这工作得很好。我运行应用程序,comboBox 获取适当的项目,并选择适当的值。
但是,这些枚举值很难看,我希望我的用户有更好的体验,所以我创建了一个扩展方法来更好地显示这些值。
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);
一切都像一个魅力。我仍然不确定为什么按值设置不起作用,但这是解决问题的一个非常紧凑的解决方案。但不如响应标记为答案那么紧凑!