如何将枚举绑定到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' }