[C#] 열거 형을 WinForms 콤보 상자에 바인딩 한 다음 설정

많은 사람들이 WinForms에서 열거 형을 콤보 상자에 바인딩하는 방법에 대한 질문에 답했습니다. 다음과 같습니다.

comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));

그러나 표시 할 실제 값을 설정할 수없는 것은 꽤 쓸모가 없습니다.

나는 시도했다 :

comboBox1.SelectedItem = MyEnum.Something; // Does not work. SelectedItem remains null

나는 또한 시도했다 :

comboBox1.SelectedIndex = Convert.ToInt32(MyEnum.Something); // ArgumentOutOfRangeException, SelectedIndex remains -1

누구든지 이것을 수행하는 방법에 대한 아이디어가 있습니까?



답변

열거 형

public enum Status { Active = 0, Canceled = 3 }; 

드롭 다운 값 설정

cbStatus.DataSource = Enum.GetValues(typeof(Status));

선택한 항목에서 열거 형 가져 오기

Status status;
Enum.TryParse<Status>(cbStatus.SelectedValue.ToString(), out status); 


답변

단순화하려면 :

먼저 초기화 명령 : (예를 들어, 후 InitalizeComponent())

yourComboBox.DataSource =  Enum.GetValues(typeof(YourEnum));

콤보 박스에서 선택한 항목을 검색하려면 :

YourEnum enum = (YourEnum) yourComboBox.SelectedItem;

콤보 박스의 값을 설정하려면 :

yourComboBox.SelectedItem = YourEnem.Foo;


답변

코드

comboBox1.SelectedItem = MyEnum.Something;

괜찮습니다. 문제는 DataBinding에 있어야합니다. DataBinding 할당은 주로 콤보 상자가 처음 표시 될 때 생성자 이후에 발생합니다. Load 이벤트에서 값을 설정해보십시오. 예를 들어, 다음 코드를 추가하십시오.

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    comboBox1.SelectedItem = MyEnum.Something;
}

그리고 그것이 작동하는지 확인하십시오.


답변

시험:

comboBox1.SelectedItem = MyEnum.Something;

편집 :

벌써 시도해 보셨군요. 그러나 내 comboBox가 DropDownList로 설정되었을 때 저에게 효과적이었습니다.

다음은 나를 위해 작동하는 전체 코드입니다 (DropDown 및 DropDownList 사용).

public partial class Form1 : Form
{
    public enum BlahEnum
    {
        Red,
        Green,
        Blue,
        Purple
    }

    public Form1()
    {
        InitializeComponent();

        comboBox1.DataSource = Enum.GetValues(typeof(BlahEnum));

    }

    private void button1_Click(object sender, EventArgs e)
    {
        comboBox1.SelectedItem = BlahEnum.Blue;
    }
}


답변

다음 열거 형이 있다고 가정 해 보겠습니다.

public enum Numbers {Zero = 0, One, Two};

이러한 값을 문자열에 매핑하려면 구조체가 필요합니다.

public struct EntityName
{
    public Numbers _num;
    public string _caption;

    public EntityName(Numbers type, string caption)
    {
        _num = type;
        _caption = caption;
    }

    public Numbers GetNumber()
    {
        return _num;
    }

    public override string ToString()
    {
        return _caption;
    }
}

이제 모든 열거 형이 문자열에 매핑 된 객체 배열을 반환합니다.

public object[] GetNumberNameRange()
{
    return new object[]
    {
        new EntityName(Number.Zero, "Zero is chosen"),
        new EntityName(Number.One, "One is chosen"),
        new EntityName(Number.Two, "Two is chosen")
    };
}

그리고 다음을 사용하여 콤보 상자를 채 웁니다.

ComboBox numberCB = new ComboBox();
numberCB.Items.AddRange(GetNumberNameRange());

함수에 전달하려는 경우에 대비하여 열거 형 유형을 검색하는 함수를 만듭니다.

public Numbers GetConversionType()
{
    EntityName type = (EntityName)numberComboBox.SelectedItem;
    return type.GetNumber();
}

그리고 당신은 괜찮을 것입니다 🙂


답변

이 시도:

// fill list
MyEnumDropDownList.DataSource = Enum.GetValues(typeof(MyEnum));

// binding
MyEnumDropDownList.DataBindings.Add(new Binding("SelectedValue", StoreObject, "StoreObjectMyEnumField"));

StoreObject는 MyEnum 값 저장에 대한 StoreObjectMyEnumField 속성이있는 내 개체 예제입니다.


답변

 public static void FillByEnumOrderByNumber<TEnum>(this System.Windows.Forms.ListControl ctrl, TEnum enum1, bool showValueInDisplay = true) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");

        var values = from TEnum enumValue in Enum.GetValues(typeof(TEnum))
                     select
                        new
                         KeyValuePair<TEnum, string>(   (enumValue), enumValue.ToString());

        ctrl.DataSource = values
            .OrderBy(x => x.Key)

            .ToList();

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

        ctrl.SelectedValue = enum1;
    }
    public static void  FillByEnumOrderByName<TEnum>(this System.Windows.Forms.ListControl ctrl, TEnum enum1, bool showValueInDisplay = true  ) where TEnum : struct
    {
        if (!typeof(TEnum).IsEnum) throw new ArgumentException("An Enumeration type is required.", "enumObj");

        var values = from TEnum enumValue in Enum.GetValues(typeof(TEnum))
                     select
                        new
                         KeyValuePair<TEnum,string> ( (enumValue),  enumValue.ToString()  );

        ctrl.DataSource = values
            .OrderBy(x=>x.Value)
            .ToList();

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

        ctrl.SelectedValue = enum1;
    }