作为ComboBox DataSource的不同派生对象的列表

时间:2012-12-20 08:22:25

标签: c# winforms binding lambda

我的应用程序包含一个winform,可以在图像上绘制框。这些框具有坐标,类型(来自主FormBox类的所有派生类)和可能的group参数(在生成的XML中用于导出)。

用户从ComboBox中选择此组参数。最初,ComboBox为空,用户可以在一个类型的盒子上设置一个GroupName,它将为相同类型的其他盒填充ComboBox列表,从而允许它们组合在一起或不组合。

我现在需要为多个盒子类型组合分组,并且一直在抨击墙壁以便填充这个ComboBox。

对于一种盒子类型,确实没有问题:

cboUserField_GroupName.DataSource = (from aBox in someFormData.Boxes
where (aBox is UserContentFormBox) select (aBox as UserContentFormBox)).GroupBy(x => x.GroupName).Select(x => x.First()).ToList();

cboUserField_GroupName.ValueMember = "GroupName";

但是由于我有两个单独的列表,每个列表都填充了来自FormBox子类的对象集合,我想将ComboBox控件绑定到一个联合列表,无论它是GroupName字符串或对象并不重要。 这没什么用,主要是因为我无法从简单的List<string>中找出值成员的内容,另外因为列表最终还是被空对象填充了:

List<string> groupNames = (from aBox in someFormData.Boxes where (aBox is UserContentFormBox || aBox is VATReturnFormBox) select aBox.GroupName).Distinct().ToList();

cboUserField_GroupName.DataSource = groupNames.ToList();

因此,简而言之,我如何将一个ComboBox控件绑定到一个列表,使用从基类派生的对象填充(通过lambda)?绑定应该在GroupName属性上。

我应该将每个列表带回List<FormBox>,这可以轻松加入吗?还有其他更好的方法吗?

1 个答案:

答案 0 :(得分:0)

好的发现了。 首先,创建对象List<string>属性的两个GroupName

List<string> firstList = (from aBox in someFormData.Boxes
where (aBox is UserContentFormBox)
select (aBox as UserContentFormBox).GroupName).Distinct().ToList();

List<string> secondList = (from aBox in someFormData.Boxes
where (aBox is VATReturnFormBox)
select (aBox as VATReturnFormBox).GroupName).Distinct().ToList();

然后,加入这些列表,删除空值和重复项,排序并填充新列表:

List<string> groupNames = firstList.Union(secondList).Where(x => x != null).Distinct().OrderBy(x => x).ToList();

最后,使用值填充必要的ComboBox:

cboUserField_GroupName.Items.AddRange(groupNames.ToArray());
cboVATReturn_GroupName.Items.AddRange(groupNames.ToArray());

非常感谢。