2011-04-12 62 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

相關問題