如果我将WinForms ComboBox绑定到枚举类型的值,即

combo1.DropDownStyle = ComboBoxStyle.DropDownList;
combo1.DataSource = Enum.GetValues(typeof(myEnumType));

谁知道我如何能够获得相同的结果,而除了匹配每个枚举值的条目之外,我还可以有一个空白条目代表没有选择?

我不能简单地为枚举类型添加一个特殊值,因为这必须灵活处理任何枚举类型。

感谢您的帮助。

编辑:我应该明确表示我想绑定实际的枚举值而不是它们的名字。如果绑定了实际的枚举值,ComboBox会负责调用它们的ToString()来获取要显示的文本。

有帮助吗?

解决方案 3

(请参阅我的问题编辑,我澄清了我不想绑定到字符串集合。)

经过更多的摆弄,下面的怪物似乎有效。 combo1.SelectedItem是object类型,可以是DBNull或(盒装?)枚举值。这段代码是否可取?

combo1.DataSource = (new object[] { DBNull.Value }
                        .Concat(Enum.GetValues(refToAnEnumType)
                            .Cast<object>())).ToList()

编辑:我看到亚当和安德鲁的方法很容易适应做同样的事情。谢谢你们!

其他提示

不确定你们是否已经尝试了所有已发布的代码,但是你们无法添加项目做一个数据绑定的ComboBox。这是winforms,而不是WPF,因此没有“DataBind”。功能

你可以这样做:

public static string[] GetEnumValues<T>(bool includeBlank) 
{
    List<string> values = new List<string>((Enum.GetValues(typeof(T)) as T[]).Select(t => t.ToString()));

    if (includeBlank)
    {
        values.Insert(0, string.Empty);
    }

    return values.ToArray();
}

然后

combo.DataSource = GetEnumValues<myEnumType>(true);

您可以尝试这样的事情:

编辑以反映Brad_Z的出色建议

static IEnumerable<String> getValues<T>(String initialValue)
{
    yield return initialValue;

    foreach (T t in Enum.GetValues(typeof(T)))
        yield return t.ToString();
}

static IEnumerable<String> getValues<T>()
{
    return getValues<T>(String.Empty);
}

这将允许您绑定到此函数的结果,如下所示:

combo1.DataSource = getValues<myEnumType>().ToArray();

或者像这样,如果你想为初始项目指定一个不同的值:

combo1.DataSource = getValues<myEnumType>("Select").ToArray();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top