[c#] 將枚舉綁定到WinForms組合框,然後進行設置


Answers

代碼

comboBox1.SelectedItem = MyEnum.Something;

沒問題,問題必須存在於DataBinding中。 DataBinding分配發生在構造函數之後,主要是第一次顯示組合框。 嘗試設置Load事件中的值。 例如,添加以下代碼:

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

並檢查它是否有效。

Question

很多人已經回答瞭如何將枚舉綁定到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 Form1()
{
    InitializeComponent();
    comboBox.DataSource = EnumWithName<SearchType>.ParseEnum();
    comboBox.DisplayMember = "Name";
}

public class EnumWithName<T>
{
    public string Name { get; set; }
    public T Value { get; set; }

    public static EnumWithName<T>[] ParseEnum()
    {
        List<EnumWithName<T>> list = new List<EnumWithName<T>>();

        foreach (object o in Enum.GetValues(typeof(T)))
        {
            list.Add(new EnumWithName<T>
            {
                Name = Enum.GetName(typeof(T), o).Replace('_', ' '),
                Value = (T)o
            });
        }

        return list.ToArray();
    }
}

public enum SearchType
{
    Value_1,
    Value_2
}



為了簡化:

首先初始化這個命令:(例如在InitalizeComponent()

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

檢索組合框上的選定項目
YourEnum enum = (YourEnum) yourComboBox.SelectedItem

如果你想為組合框設置值
yourComboBox.SelectedItem = YourEnem.Foo




嘗試這個:

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

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

StoreObject是我的StoreObjectMyEnumField屬性用於存儲MyEnum值的對象示例。




    public enum Colors
    {
        Red = 10,
        Blue = 20,
        Green = 30,
        Yellow = 40,
    }

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

完整源代碼... 將枚舉綁定到Combobox







您可以使用KeyValuePair值的列表作為組合框的數據源。 您將需要一個幫助器方法,您可以在其中指定枚舉類型,並返回IEnumerable>,其中int是枚舉值,string是枚舉值的名稱。 在您的組合框中,將DisplayMember屬性設置為'Key'並將ValueMember屬性設置為'Value'。 Value和Key是KeyValuePair結構的公共屬性。 然後,當你將SelectedItem屬性設置為像你這樣的枚舉值時,它應該可以工作。




comboBox1.SelectedItem = MyEnum.Something;

應該工作得很好......你怎麼知道SelectedItem是空的?




將枚舉設置為數據源以便下拉的通用方法

顯示將是名稱。 選定的值將是Enum本身

public IList<KeyValuePair<string, T>> GetDataSourceFromEnum<T>() where T : struct,IConvertible
    {
        IList<KeyValuePair<string, T>> list = new BindingList<KeyValuePair<string, T>>();
        foreach (string value in Enum.GetNames(typeof(T)))
        {
            list.Add(new KeyValuePair<string, T>(value, (T)Enum.Parse(typeof(T), value)));
        }
        return list;
    }



在Framework 4中,您可以使用以下代碼:

要將MultiColumnMode枚舉綁定到組合框,例如:

cbMultiColumnMode.Properties.Items.AddRange(typeof(MultiColumnMode).GetEnumNames());

並獲得選定的索引:

MultiColumnMode multiColMode = (MultiColumnMode)cbMultiColumnMode.SelectedIndex;

注意:在這個例子中,我使用DevExpress組合框,你可以在Win Form Combobox中做同樣的事情




我使用以下幫助器方法,您可以綁定到您的列表。

    ''' <summary>
    ''' Returns enumeration as a sortable list.
    ''' </summary>
    ''' <param name="t">GetType(some enumeration)</param>
    Public Shared Function GetEnumAsList(ByVal t As Type) As SortedList(Of String, Integer)

        If Not t.IsEnum Then
            Throw New ArgumentException("Type is not an enumeration.")
        End If

        Dim items As New SortedList(Of String, Integer)
        Dim enumValues As Integer() = [Enum].GetValues(t)
        Dim enumNames As String() = [Enum].GetNames(t)

        For i As Integer = 0 To enumValues.GetUpperBound(0)
            items.Add(enumNames(i), enumValues(i))
        Next

        Return items

    End Function





Links