Binding an enum to a WinForms combo box, and then setting it

前端 未结 28 2007
心在旅途
心在旅途 2020-11-28 04:33

a lot of people have answered the question of how to bind an enum to a combo box in WinForms. Its like this:

comboBox1.DataSource = Enum.GetValues(typeof(MyE         


        
相关标签:
28条回答
  • 2020-11-28 04:44
    comboBox1.SelectedItem = MyEnum.Something;
    

    should work just fine ... How can you tell that SelectedItem is null?

    0 讨论(0)
  • 2020-11-28 04:45

    To simplify:

    First Initialize this command: (e.g. after InitalizeComponent())

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

    To retrieve selected item on combobox:

    YourEnum enum = (YourEnum) yourComboBox.SelectedItem;
    

    If you want to set value for the combobox:

    yourComboBox.SelectedItem = YourEnem.Foo;
    
    0 讨论(0)
  • 2020-11-28 04:45

    Let's say you have the following enum

    public enum Numbers {Zero = 0, One, Two};
    

    You need to have a struct to map those values to a string:

    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;
        }
    }
    

    Now return an array of objects with all the enums mapped to a string:

    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")
        };
    }
    

    And use the following to populate your combo box:

    ComboBox numberCB = new ComboBox();
    numberCB.Items.AddRange(GetNumberNameRange());
    

    Create a function to retrieve the enum type just in case you want to pass it to a function

    public Numbers GetConversionType() 
    {
        EntityName type = (EntityName)numberComboBox.SelectedItem;
        return type.GetNumber();           
    }
    

    and then you should be ok :)

    0 讨论(0)
  • 2020-11-28 04:45

    A little late to this party ,

    The SelectedValue.ToString() method should pull in the DisplayedName . However this article DataBinding Enum and also With Descriptions shows a handy way to not only have that but instead you can add a custom description attribute to the enum and use it for your displayed value if you preferred. Very simple and easy and about 15 lines or so of code (unless you count the curly braces) for everything.

    It is pretty nifty code and you can make it an extension method to boot ...

    0 讨论(0)
  • 2020-11-28 04:46

    None of these worked for me, but this did (and it had the added benefit of being able to have a better description for the name of each enum). I'm not sure if it's due to .net updates or not, but regardless I think this is the best way. You'll need to add a reference to:

    using System.ComponentModel;

    enum MyEnum
    {
        [Description("Red Color")]
        Red = 10,
        [Description("Blue Color")]
        Blue = 50
    }
    
    ....
    
        private void LoadCombobox()
        {
            cmbxNewBox.DataSource = Enum.GetValues(typeof(MyEnum))
                .Cast<Enum>()
                .Select(value => new
                {
                    (Attribute.GetCustomAttribute(value.GetType().GetField(value.ToString()), typeof(DescriptionAttribute)) as DescriptionAttribute).Description,
                    value
                })
                .OrderBy(item => item.value)
                .ToList();
            cmbxNewBox.DisplayMember = "Description";
            cmbxNewBox.ValueMember = "value";
        }
    

    Then when you want to access the data use these two lines:

            Enum.TryParse<MyEnum>(cmbxNewBox.SelectedValue.ToString(), out MyEnum proc);
            int nValue = (int)proc;
    
    0 讨论(0)
  • 2020-11-28 04:48

    I use the following helper method, which you can bind to your list.

        ''' <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
    
    0 讨论(0)
提交回复
热议问题