我已经阅读了WinForms ComboBox的ValueMember属性的主题很多有用的帖子,但他们都没有回答我的具体问题。首先,我将描述一个简单的例子,它可以正常工作,然后我将描述我想如何改变它,并询问如何做到这一点(我也会提供我的一个尝试)。通过ValueMember的ValueMember选择类的属性
一,工作示例。只是一个带有comboBox控件的表单,并且此代码如下:
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;
}
}
}
我的问题是,如何最好我利用这个扩展方法,同时保持从枚举值的列表构建组合框项目,并能够通过设置选定ComboBox项(或价值)的能力枚举值?
以下是我的第一次尝试。我创建了一个简单的类来包装枚举值和显示字符串,并将组合框DisplayMember和ValueMember设置为新类的属性。这部分工作; ComboBox的项目与显示值正确填充,但我不能设置的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);
一切都像魅力一样。我仍然不确定为什么按价值设置不起作用,但这是解决问题的非常紧凑的解决方案。但并不像回答那样紧凑!
好设置的SelectedValue不工作,因为你有字符串数据,并希望与枚举值来选择它的组合框。 – wonko79 2013-05-07 14:18:45
你可能也想看到这个如何做 - 我 - 覆盖-tostring-in-c-sharp-enums – nawfal 2013-06-08 22:25:12