将枚举类型绑定到WinForms组合框,然后进行设置

141

很多人已经回答了如何在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

有人有任何想法怎么做吗?


3
为什么不尝试使用 ComboBox.SelectedValue 呢? - Oliver Friedrich
6
如果你的问题已经得到回答,你应该选择一个答案。 - Ryan Leach
数据绑定枚举的目的并不是很清楚。枚举在运行时很可能不会改变。您还可以编写一个扩展方法,将组合框的项集合填充为枚举的所有值。 - Andreas
相关链接:https://dev59.com/L2035IYBdhLWcg3wE71s - JYelton
@OliverFriedrich 对我来说,SelectedValue 引发了一个 InvalidOperationException。"无法在具有空 ValueMemberListControl 中设置 SelectedValue。" - Tyler
28个回答

0

将枚举设置为下拉框数据源的通用方法

显示名称,选定值将是枚举本身

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

0

这一直是个问题。如果你有一个排序好的枚举,比如从0到...

public enum Test
      one
      Two
      Three
 End

你可以将名称绑定到组合框,而不是使用 .SelectedValue 属性,而是使用 .SelectedIndex

   Combobox.DataSource = System.Enum.GetNames(GetType(test))

Dim x as byte = 0
Combobox.Selectedindex=x

0
有点晚来到这个派对,
SelectedValue.ToString() 方法应该提取 DisplayedName。 然而,这篇文章DataBinding Enum and also With Descriptions展示了一种方便的方法,不仅可以实现这一点,还可以向枚举添加自定义描述属性,并将其用作显示值。非常简单易行,只需大约15行代码(除去花括号)即可完成一切。
这段代码相当巧妙,而且你还可以将其作为扩展方法使用...

0

0
你可以使用“FindString…”函数:
Public Class Form1
    Public Enum Test
        pete
        jack
        fran
        bill
    End Enum
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ComboBox1.DataSource = [Enum].GetValues(GetType(Test))
        ComboBox1.SelectedIndex = ComboBox1.FindStringExact("jack")
        ComboBox1.SelectedIndex = ComboBox1.FindStringExact(Test.jack.ToString())
        ComboBox1.SelectedIndex = ComboBox1.FindStringExact([Enum].GetName(GetType(Test), Test.jack))
        ComboBox1.SelectedItem = Test.bill
    End Sub
End Class

0
comboBox1.SelectedItem = MyEnum.Something;

应该可以正常工作...你怎么知道SelectedItem是空值?


我可以在调试器中检查它。我猜是因为SelectedItem的类型是对象,即引用类型,而枚举是值类型。虽然我本来希望编译器能够捕捉到这一点。 - Tony Miletto

0
您可以使用KeyValuePair值列表作为组合框的数据源。您需要一个帮助方法,其中您可以指定枚举类型,并返回IEnumerable>,其中int是枚举的值,string是枚举值的名称。在您的组合框中,将DisplayMember属性设置为“Key”,将ValueMember属性设置为“Value”。Value和Key是KeyValuePair结构的公共属性。然后,当您将SelectedItem属性设置为像您正在执行的枚举值时,它应该可以工作。

0

目前我正在使用Items属性而不是DataSource,这意味着我必须为每个枚举值调用Add,但它只是一个小的枚举,并且它是临时代码。

然后我可以对该值执行Convert.ToInt32并使用SelectedIndex设置它。

暂时的解决方案,但现在不需要YAGNI。

感谢您的想法,当我获得一轮客户反馈后,我可能会在做正确版本时使用它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接