如何将枚举绑定到combobox
我将绑定一个枚举的值与一个combobox控件。
我已经写了这个代码:
cboPriorLogicalOperator.DataSource = Enum.GetValues(typeof(MyEnum)) .Cast<MyEnum>() .Select(p => new { Key = (int)p, Value = p.ToString() }) .ToList(); myComboBox.DisplayMember = "Value"; myComboBox.ValueMember = "Key";
它运作良好,但我想知道是否有一个更简单的方法。
我认为你的代码很漂亮!
唯一的改进是将代码放在扩展方法中 。
编辑:
当我想到的时候,你想要做的就是在定义中使用Enum
,而不是扩展方法所需的枚举实例。
我发现这个问题 ,很好地解决了这个问题 :
public class SelectList { // Normal SelectList properties/methods go here public static Of<T>() { Type t = typeof(T); if (t.IsEnum) { var values = from Enum e in Enum.GetValues(type) select new { ID = e, Name = e.ToString() }; return new SelectList(values, "Id", "Name"); } return null; } } // called with var list = SelectList.Of<Things>();
只有你可能想返回一个Dictionary<int, string>
而不是一个SelectList
,但你明白了。
EDIT2:
在这里,我们将使用一个代码示例来说明您正在查看的案例。
public class EnumList { public static IEnumerable<KeyValuePair<T, string>> Of<T>() { return Enum.GetValues(typeof (T)) .Cast<T>() .Select(p => new KeyValuePair<T, string>(p, p.ToString())) .ToList(); } }
或者这个版本也许,关键是一个int
public class EnumList { public static IEnumerable<KeyValuePair<int, string>> Of<T>() { return Enum.GetValues(typeof (T)) .Cast<T>() .Select(p => new KeyValuePair<int, string>(Convert.ToInt32(p), p.ToString())) .ToList(); } }
为什么不使用:
myComboBox.DataSource = Enum.GetValues(typeof(MyEnum))
?
foreach (int r in Enum.GetValues(typeof(MyEnum))) { var item = new ListItem(Enum.GetName(typeof(MyEnum), r), r.ToString()); ddl.Items.Add(item); }
我最近遇到了一个问题,我有一个空的枚举属性,需要绑定到一个combobox。 这是我提出的解决scheme:
using System; using System.Collections.Generic; namespace ActivitySchedule.Model { public class NullableEnum<T> where T : struct, IComparable { public string Display { get; private set; } public T? Value { get; private set; } public static implicit operator T?(NullableEnum<T> o) { return o.Value; } public static implicit operator NullableEnum<T>(T? o) { return new NullableEnum<T> { Display = o?.ToString() ?? "NA", Value = o }; } private NullableEnum() { } public static IEnumerable<NullableEnum<T>> GetList() { var items = new List<NullableEnum<T>> { new NullableEnum<T> { Display = "NA", Value = null } }; var values = Enum.GetValues(typeof(T)); foreach (T v in values) { items.Add(v); } return items; } } }
我将该对象包装在Controller类中,并更改属性的Type,如下所示:
private MyClass myClass; public NullableEnum<MyEnum> MyEnum { get { return this.myClass.MyEnum; } set { this.myClass.MyEnum = value.Value; } }
(它也可以是派生类,并覆盖属性)
这是我用它的方式:
var types = NullableEnum<MyEnum>.GetList(); this.comboBox1.DataSource = types; this.comboBox1.DisplayMember = "Display"; this.comboBox1.ValueMember = "Value"; this.comboBox1.Bindings.Add("SelectedValue", myClassController, "MyEnum");
private void Form1_Load(object sender, EventArgs e) { comboBox1.DataSource = Enum.GetValues( typeof(Gender)); Array gen = Enum.GetValues(typeof(Gender)); List<KeyValuePair<string, char>> lstgender = new List<KeyValuePair<string,char>>(); foreach(Gender g in gen) lstgender.Add(new KeyValuePair<string,char>(g.ToString(),((char)g))); comboBox1.DataSource = lstgender; comboBox1.DisplayMember = "key"; comboBox1.ValueMember = "value" } private void button1_Click(object sender, EventArgs e) { MessageBox.Show(comboBox1.SelectedValue.ToString()); } public class Student { public string stud_name { get; set; } public Gender stud_gen { get; set; } } public enum Gender { Male='M', Female='F' }