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

솔루션이 효과가 있다면 왜 더 간단한 솔루션을 찾고 있습니까? –

+0

@ Ramhound : 직접적인 방법이 있을지도 모르지만. 나는 내 코드를 이해하지만 모든 사람이 그렇게 할 수있는 것은 아니다. 그래서 나는 더 간단한 것을 찾았다. – Homam

+1

@ Homom 그런 식으로 의도했는지 모르겠지만 내 솔루션에 대한 코드를 모델링했을 때 combobox의 값을 올바르게 표시하기 위해 select 문에서 키와 값 유형을 바꿔야했습니다. 당신의 방법은 콤보 박스에 키를 표시하는 것을 끝내었다. – gonzobrains

답변

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

+0

'Of'는 무엇을 반환합니까? – Homam

+0

아, 그들은 원래 예제에서 그것을 놓쳤습니다. 귀하의 경우 그것은'Dictionary '을 반환 할 것이라고 나는 생각한다. –

6

아마도이 버전 :

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

?

+0

키/값 쌍을 바인드하지 않기 때문에. 콤보 상자에서 값을 가져 오려면 SelectedItem을 열거 형으로 캐스팅해야합니다. 비고 섹션의 http://msdn.microsoft.com/en-us/library/system.enum.getvalues.aspx를 참조하십시오. –

+0

검색된 데이터에서 조건을 설정하고 싶다면 문제의 코드가 꽤 좋다 ... 그렇지 않으면 코드가 더 좋습니다. –

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

저는 최근 nullable enum 속성이있는 곳에서 문제가 발생하여 ComboBox에 바인딩해야했습니다.

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

(이것은 또한 파생 클래스가 될 수과를 오버라이드 (override) 여기에 내가 생각 해낸 해결책이다

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' 
} 
: 속성)

이것은 내가 그것을 사용하는 방법입니다 0

+2

코드에 설명을 추가하십시오. –

관련 문제