สิ่งที่คุณต้องการคือเปลี่ยน enum ให้เป็น ReadonlyCollection และผูกคอลเลกชันเข้ากับ combobox (หรือคู่คีย์ - ค่าใด ๆ ที่เปิดใช้งานการควบคุมสำหรับเรื่องนั้น)
ก่อนอื่นคุณต้องมีชั้นเรียนเพื่อบรรจุรายการของรายการ เนื่องจากสิ่งที่คุณต้องการคือคู่ 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
}
นี่คืออินเทอร์เฟซและคลาสตัวอย่างที่ใช้งานได้โปรดสังเกตว่าคีย์คลาส 'ถูกพิมพ์ลงใน Enum อย่างมากและมีการใช้คุณสมบัติ IValueDesc คู่คีย์ / ค่า
ตอนนี้คลาส 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;
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 ดังนั้นค่า combobox ควรส่งคืนค่า enum หากคุณเชื่อมโยงกับ proprtie ที่เหมาะสม
ฉันได้เพิ่มคุณสมบัติ T this [Enum t] เพื่อให้คอลเลกชันมีประโยชน์มากยิ่งขึ้นกว่าการใช้งานคอมโบธรรมดา ๆ ตัวอย่างเช่น textBox1.Text = enumcol [HowNice.ReallyNice] .NicenessDescription;
แน่นอนคุณสามารถเลือกที่จะเปลี่ยน MyItem ให้เป็นคลาสคีย์ / ค่าที่ใช้สำหรับ puprose นี้เท่านั้นโดยข้าม MyItem ในอาร์กิวเมนต์ประเภท EnumToReadnlyCollection ทั้งหมด แต่คุณจะถูกบังคับให้ใช้ int สำหรับคีย์ (หมายถึงการรับ combobox1.SelectedValue จะคืนค่า int และไม่ใช่ประเภท enum) คุณสามารถหลีกเลี่ยงสิ่งนั้นได้หากคุณสร้างคลาส KeyValueItem เพื่อแทนที่ MyItem และอื่น ๆ ...