在ComboBox

时间:2017-05-21 07:39:07

标签: c# combobox enums datasource

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

    this.comboBoxColor.DataSource = System.Enum.GetValues(typeof(System.Drawing.KnownColor));

但是当我把它放在InitializeComponent中时,它会用枚举中所有项的数组的静态赋值替换这一行。它执行两次,一次用于Datasource,一次用于Items属性。

但这些东西不能合作。当绑定DataSource时,向Items列表添加项会导致错误,而在进行此操作时,分配SelectedValue属性的其他方式不再有效。

我尝试使用单独的方法在InitializeComponent方法之外执行此操作。只需在单独的方法中设置如上所述的DataSource就会产生以下错误:
System.InvalidOperationException:'无法在ListControl中设置具有空ValueMember的SelectedValue。'

编辑:Microsoft表示应该使用简单数组作为数据源:https://msdn.microsoft.com/nl-nl/library/x8160f6f(v=vs.110).aspx
可以在设计器中指定数据源,但只允许选择类。一个班级必须实现什么才能使其发挥作用?

1 个答案:

答案 0 :(得分:1)

您可以编写一个简单的方法,将您的枚举转换为数据表,然后将该方法的结果用作DataSource,并为组合的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;

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