열거 형을 ReadonlyCollection으로 바꾸고 컬렉션을 콤보 상자 (또는 그 문제에 대한 키-값 쌍 사용 컨트롤)에 바인딩하는 것이 필요합니다.
먼저 목록의 항목을 포함하는 클래스가 필요합니다. 필요한 것은 int / string 쌍이므로 인터페이스와 기본 클래스 콤보를 사용하여 원하는 객체에서 기능을 구현할 수 있습니다.
public interface IValueDescritionItem
{
int Value { get; set;}
string Description { get; set;}
}
public class MyItem : IValueDescritionItem
{
HowNice _howNice;
string _description;
public MyItem()
{
}
public MyItem(HowNice howNice, string howNice_descr)
{
_howNice = howNice;
_description = howNice_descr;
}
public HowNice Niceness { get { return _howNice; } }
public String NicenessDescription { get { return _description; } }
#region IValueDescritionItem Members
int IValueDescritionItem.Value
{
get { return (int)_howNice; }
set { _howNice = (HowNice)value; }
}
string IValueDescritionItem.Description
{
get { return _description; }
set { _description = value; }
}
#endregion
}
클래스의 Key는 Enum에 강력하게 입력되고 IValueDescritionItem 속성은 명시 적으로 구현됩니다 (클래스에 모든 속성이있을 수 있으며 클래스를 구현하는 속성을 선택할 수 있음). 키 / 값 쌍.
이제 EnumToReadOnlyCollection 클래스 :
public class EnumToReadOnlyCollection<T,TEnum> : ReadOnlyCollection<T> where T: IValueDescritionItem,new() where TEnum : struct
{
Type _type;
public EnumToReadOnlyCollection() : base(new List<T>())
{
_type = typeof(TEnum);
if (_type.IsEnum)
{
FieldInfo[] fields = _type.GetFields();
foreach (FieldInfo enum_item in fields)
{
if (!enum_item.IsSpecialName)
{
T item = new T();
item.Value = (int)enum_item.GetValue(null);
item.Description = ((ItemDescription)enum_item.GetCustomAttributes(false)[0]).Description;
//above line should be replaced with proper code that gets the description attribute
Items.Add(item);
}
}
}
else
throw new Exception("Only enum types are supported.");
}
public T this[TEnum key]
{
get
{
return Items[Convert.ToInt32(key)];
}
}
}
따라서 코드에서 필요한 것은 다음과 같습니다.
private EnumToReadOnlyCollection<MyItem, HowNice> enumcol;
enumcol = new EnumToReadOnlyCollection<MyItem, HowNice>();
comboBox1.ValueMember = "Niceness";
comboBox1.DisplayMember = "NicenessDescription";
comboBox1.DataSource = enumcol;
컬렉션은 MyItem으로 입력되므로 적절한 속성에 바인딩하면 콤보 상자 값이 열거 형 값을 반환해야합니다.
T this [Enum t] 속성을 추가하여 간단한 콤보 소모품보다 컬렉션을 더욱 유용하게 만듭니다 (예 : textBox1.Text = enumcol [HowNice.ReallyNice] .NicenessDescription;
물론 EnumToReadnlyCollection의 유형 인수에서 MyItem을 효과적으로 건너 뛰는이 puprose에만 사용되는 Key / Value 클래스로 MyItem을 전환하도록 선택할 수 있지만 키에 대해 int로 이동해야합니다 (combobox1.SelectedValue를 얻는 것을 의미 함) 열거 형이 아닌 int를 반환합니다). MyItem 등을 대체하기 위해 KeyValueItem 클래스를 작성하는 경우이 문제를 해결하십시오.