2011-04-12 112 views
36

我将使用组合框控件绑定枚举的值。如何将枚举绑定到组合框

我写这段代码:

cboPriorLogicalOperator.DataSource = Enum.GetValues(typeof(MyEnum)) 
    .Cast<MyEnum>() 
    .Select(p => new { Key = (int)p, Value = p.ToString() }) 
    .ToList(); 

myComboBox.DisplayMember = "Value"; 
myComboBox.ValueMember = "Key"; 

它工作得很好,但我不知道是否有一个更简单的方法。

+0

如果您的解决方案有效,您为什么寻找更简单的解决方案? – 2011-04-12 16:52:40

+0

@ Ramhound:我虽然也许有一种*直接*的方式。我理解我的代码,但不是每个人都可以简单地做到这一点。所以我寻找更简单的一个。 – Homam 2011-04-12 16:54:57

+1

@Homam我不知道你是否打算这样,但是当我为自己的解决方案建模后,为了正确显示组合框中的值,必须在我的select语句中反转键和值类型。您的方法最终显示组合框中的按键。 – gonzobrains 2013-09-06 17:41:55

回答

24

我觉得你的代码很漂亮!

唯一的改进是将代码放在扩展方法

编辑:

当我仔细想想,你想要做的是使用Enum作为定义,而不是枚举,这是扩展方法所要求的一个实例。

我发现这个question,解决它真的很好:

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(); 
    } 
} 
+0

我同意。我们已经将winforms组合框扩展到了我们自己的版本,并且在其上有一个BindToEnum 方法,非常有效。它看起来很像这个代码。 – captncraig 2011-04-12 16:39:19

+0

“Of”会返回什么? – Homam 2011-04-12 17:07:54

+0

啊,他们错过了原来的例子。在你的情况下,它会返回'字典',我想。 – 2011-04-12 17:30:09

6

为什么不使用:

myComboBox.DataSource = Enum.GetValues(typeof(MyEnum)) 

+0

因为这不会绑定键/值对。要从组合框中获取值,必须将SelectedItem转换为枚举。请参阅备注部分中的http://msdn.microsoft.com/zh-CN/library/system.enum.getvalues.aspx。 – 2012-01-05 20:32:46

+0

我想如果我们想在检索的数据中设置条件,那么问题的代码是相当不错的,否则你的代码更好.. – 2017-06-06 17:15:55

1
foreach (int r in Enum.GetValues(typeof(MyEnum))) 
{ 
    var item = new ListItem(Enum.GetName(typeof(MyEnum), r), r.ToString()); 
    ddl.Items.Add(item); 
} 
0

我最近遇到了一个问题,我有一个可为空的枚举属性,并需要将其绑定到组合框。这里是我想出了一个解决方案:

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; 
     } 
    } 
} 

我包裹在一个控制器类的对象并更改属性的类型,像这样:

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"); 
-1
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' 
} 
+2

请给代码添加一些解释 – 2017-02-23 14:16:35

相关问题