C# 在组合框上映射枚举值

C# 在组合框上映射枚举值,c#,combobox,enums,datasource,C#,Combobox,Enums,Datasource,我想使用C Windows窗体组合框选择枚举值: this.comboBoxColor.DataSource = System.Enum.GetValues(typeof(System.Drawing.KnownColor)); 但是当我把它放在InitializeComponent中时,它用一个数组的静态赋值替换了这一行,数组中包含枚举中的所有项。它执行两次,一次用于数据源,一次用于Items属性 但是这些东西不能一起工作。当拥有绑定的数据源时,将项添加到项列表会导致错误,而以另一种

我想使用C Windows窗体组合框选择枚举值:

    this.comboBoxColor.DataSource = System.Enum.GetValues(typeof(System.Drawing.KnownColor));
但是当我把它放在InitializeComponent中时,它用一个数组的静态赋值替换了这一行,数组中包含枚举中的所有项。它执行两次,一次用于数据源,一次用于Items属性

但是这些东西不能一起工作。当拥有绑定的数据源时,将项添加到项列表会导致错误,而以另一种方式分配SelectedValue属性将不再有效

我尝试在InitializeComponent方法之外使用一个单独的方法来实现这一点。在单独的方法中简单地设置上述数据源会产生以下错误: System.InvalidOperationException:“无法在ValueMember为空的ListControl中设置SelectedValue。”

编辑:Microsoft表示使用简单数组作为数据源应该是可行的:
可以在设计器中指定数据源,但它只允许选择类。类必须实现什么才能使其工作?

您可以编写一个简单的方法,将枚举转换为数据表,然后将该方法的结果用作数据源,其中包含组合的ValueMember和DisplayMember属性的一对已知名称

public DataTable CreateTableFromEnum(Type t)
{
    DataTable dt = new DataTable();
    if (t.IsEnum)
    {
        dt.Columns.Add("key", t);
        dt.Columns.Add("text", typeof(string));

        foreach(var v in Enum.GetValues(t))
            dt.Rows.Add(v, v.ToString());
    }
    return dt;

}
并称之为

var colors = CreateTableFromEnum(typeof(KnownColor));
cbo.ValueMember = "key";
cbo.DisplayMember = "text";
cbo.DataSource = colors;

现在,当您查看所选值时,您将获得所选颜色的数值

您不应该在InitializeComponent中添加任何内容。每次您使用UI界面更改表单设计中的某些内容时,表单设计器都会重写它。以及关于您的数据源/项问题。这两种方法不起作用,您应该选择要使用的方法。顺便问一下,您认为如何向KnownColor枚举添加一些内容?我已经添加了自己的方法以在InitializeComponent之后调用。我不想向KnownColor枚举添加任何内容。我想用组合框从该枚举中选择一个值。