【问题标题】:Map enum values on ComboBox在 ComboBox 上映射枚举值
【发布时间】:2017-10-21 00:26:58
【问题描述】:

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

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

但是当我把它放在InitializeComponent 中时,它会用一个包含枚举中所有项目的数组的静态分配替换这一行。它会这样做两次,一次用于Datasource,一次用于Items 属性。

但是这些东西不能一起工作。当绑定了DataSource 时,将项目添加到Items 列表会导致错误,而以相反的方式分配SelectedValue 属性将不再起作用。

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

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

【问题讨论】:

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

标签: c# combobox enums datasource


【解决方案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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多