我已經閱讀了WinForms ComboBox的ValueMember屬性的主題很多有用的帖子,但他們都沒有回答我的具體問題。首先,我將描述一個簡單的例子,它可以正常工作,然後我將描述我想如何改變它,並詢問如何做到這一點(我也會提供我的一個嘗試)。通過ValueMember的ValueMember選擇類的屬性
一,工作示例。只是一個帶有comboBox控件的表單,並且此代碼如下:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox1.DataSource = Enum.GetValues(typeof(Enum1));
comboBox1.SelectedItem = Enum1.MultiWordValue2;
}
}
public enum Enum1 : int
{
Undefined,
MultiWordValue1,
MultiWordValue2
}
沒問題,這工作得很好。我運行應用程序,comboBox獲取適當的項目,並選擇適當的值。
但是,這些枚舉值是醜陋的,我希望我的用戶有更好的體驗,所以我創建了一個擴展方法,使值更好地顯示。
public static class ExtensionMethods
{
public static string ToDisplayString(this Enum1 me)
{
switch (me)
{
case Enum1.MultiWordValue1:
return "Multi Word Value 1";
case Enum1.MultiWordValue2:
return "Multi Word Value 2";
default:
return string.Empty;
}
}
}
我的問題是,如何最好我利用這個擴展方法,同時保持從枚舉值的列表構建組合框項目,並能夠通過設置選定ComboBox項(或價值)的能力枚舉值?
以下是我的第一次嘗試。我創建了一個簡單的類來包裝枚舉值和顯示字符串,並將組合框DisplayMember和ValueMember設置爲新類的屬性。這部分工作; ComboBox的項目與顯示值正確填充,但我不能設置的SelectedValue:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox1.DisplayMember = "Display";
comboBox1.ValueMember = "Value";
foreach (Enum1 e in Enum.GetValues(typeof(Enum1)))
comboBox1.Items.Add(new ValueDisplayEnum(e, e.ToDisplayString()));
comboBox1.SelectedValue = Enum1.MultiWordValue2;
}
}
public enum Enum1 : int
{
Undefined,
MultiWordValue1,
MultiWordValue2
}
public static class ExtensionMethods
{
public static string ToDisplayString(this Enum1 me)
{
switch (me)
{
case Enum1.MultiWordValue1:
return "Multi Word Value 1";
case Enum1.MultiWordValue2:
return "Multi Word Value 2";
default:
return string.Empty;
}
}
}
public class ValueDisplayEnum
{
public object Value { get; set; }
public string Display { get; set; }
private ValueDisplayEnum() { }
public ValueDisplayEnum(object _Value, string _Display)
{
Value = _Value;
Display = _Display;
}
}
爲什麼不設置的SelectedValue這樣的工作?我該如何完成一個更好的顯示字符串的枚舉組合框?
另:我認爲這可能是因爲ValueDisplayEnum的Value屬性的底層數據類型是一個對象,而不是Enum1。但是,如果將類型更改爲Enum1,則SelectedValue仍然無法正確設置。
感謝您的幫助!
編輯1:指定由Mike基於所述建議的一個解決方案:
添加以下模板化方法:
public static void SetEnumCombo<T>(ComboBox _ComboBox, T _Value)
{
foreach (ValueDisplayEnum vde in _ComboBox.Items)
if (((T)vde.Value).Equals(_Value))
_ComboBox.SelectedItem = vde;
}
而不是指定直接的SelectedValue或selectedItem的,稱此:
foreach (Enum1 e in Enum.GetValues(typeof(Enum1)))
comboBox1.Items.Add(new ValueDisplayEnum(e, e.ToDisplayString()));
SetEnumCombo(comboBox1, Enum1.MultiWordValue2);
一切都像魅力一樣。我仍然不確定爲什麼按價值設置不起作用,但這是解決問題的非常緊湊的解決方案。但並不像回答那樣緊湊!
好設置的SelectedValue不工作,因爲你有字符串數據,並希望與枚舉值來選擇它的組合框。 – wonko79 2013-05-07 14:18:45
你可能也想看到這個如何做 - 我 - 覆蓋-tostring-in-c-sharp-enums – nawfal 2013-06-08 22:25:12