绑定枚举类型值的ComboBox是否可以同时具有“空白”条目?

4

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

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

谁知道我该如何实现相同的结果,除了与每个枚举值匹配的条目之外,我还可以有一个空白条目表示未选择?
我不能简单地向枚举类型添加特殊值,因为这必须是灵活的,以处理任何枚举类型。
我很感激你的帮助。
编辑:我应该明确表示,我想绑定实际的枚举值而不是它们的名称。如果绑定实际的枚举值,则ComboBox会调用它们的ToString()来获取要显示的文本。

各位,这是WinForms,不是ASP.NET。一旦设置了数据源,在WinForms中就无法向ComboBox添加项目。 - Andrew Hare
3个回答

4

不确定您是否尝试过您发布的所有代码,但是您不能向绑定数据的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);

现在,如果我想在某个条件下选择空值,该怎么做呢?因为 DBNull 在枚举中不存在,所以应该选择哪个值? - Shivam Gupta

3
你可以尝试类似这样的方法:
(已根据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();

2
好的回答。我会在getValues函数中添加一个参数,允许指定空白条目的文本。这样你就可以这么说:getValues<catEnumType>("选择一只猫").ToArray(); - Brad_Z
谢谢您的帖子 - 那个方法很好,但我需要的是实际枚举值,而不是它们名称的字符串表示 :-) - xyz

1
(请看我对问题的编辑,我澄清了我不想绑定到一组字符串。)
经过更多的尝试,以下的怪物似乎能够工作。combo1.SelectedItem 是对象类型,可以是 DBNull 或 (装箱的?) 枚举值。这段代码可行吗?
combo1.DataSource = (new object[] { DBNull.Value }
                        .Concat(Enum.GetValues(refToAnEnumType)
                            .Cast<object>())).ToList()

编辑:我看到Adam和Andrew的方法可以很容易地适应做同样的事情。谢谢你们!


现在,如果我想选择空值,我该怎么做?因为 DBNull 在枚举中不存在,所以我应该选择哪个值? - Shivam Gupta

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