많은 사람들이 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;
}