如果我将WinForms ComboBox绑定到枚举类型的值,即
combo1.DropDownStyle = ComboBoxStyle.DropDownList;
combo1.DataSource = Enum.GetValues(typeof(myEnumType));
谁知道我如何能够获得相同的结果,而除了匹配每个枚举值的条目之外,我还可以有一个空白条目代表没有选择?
我不能简单地为枚举类型添加一个特殊值,因为这必须灵活处理任何枚举类型。
感谢您的帮助。
编辑:我应该明确表示我想绑定实际的枚举值而不是它们的名字。如果绑定了实际的枚举值,ComboBox会负责调用它们的ToString()来获取要显示的文本。
答案 0 :(得分: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);
答案 1 :(得分: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 :(得分:1)
(请参阅我的问题编辑,我澄清了我不想绑定到字符串集合。)
经过更多的摆弄,下面的怪物似乎有效。 combo1.SelectedItem是object类型,可以是DBNull或(盒装?)枚举值。这段代码是否可取?
combo1.DataSource = (new object[] { DBNull.Value }
.Concat(Enum.GetValues(refToAnEnumType)
.Cast<object>())).ToList()
编辑:我看到亚当和安德鲁的方法很容易适应做同样的事情。谢谢你们!