从1个可容数填充多个组合框

时间:2015-12-30 13:58:57

标签: vb.net linq combobox ienumerable

下午好,

有没有办法划分不可数,并将所有不同的值绑定到不同的组合框。

您可以在下图中看到: 我得到了10个组合框,而这些组合的输入都来自1个无数。

Overview of the application

我可以选择为每个数据库执行操作并浏览整个数据库,然后将它们添加到组合框中:

        Dim ts As IEnumerable(Of tblLabel)
        For Each itms In ts
            CmbDescription.Items.Add(itms.Description)
            CmbLabelId.Items.Add(itms.LabelID)
            ...
        Next

但我想知道是否可以将Ienumerable的不同“列”直接链接到相关组合框的数据源。 我正在寻找一个类似的选项:

         CmbDescription.DataSource = ts.Description
         CmbLabelId.DataSource = ts.LabelId
         ...

可悲的是,据我所知,这个无数的人不能像这样分开。 另一种解决方法是为所有这些组合框创建所有单独的可用数据,但是代码太多了。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我认为你原来的做法已经足够了 但是如果你想通过使用DataSource属性的分隔项集合来填充ComboBox,那么你可以从IEnumerable

获得所需的集合。
CmbLabelId.DataSource = 
    ts.Select(function(label) label.LabelId).Distinct().ToList()
CmbDescription.DataSource = 
    ts.Select(function(label) label.Description).Distinct().ToList()

但是在这种方法中,您将循环IEnumerable的次数与您拥有的ComboBoxes的次数相同。

这是我的方法,但又想说你原来的方法很简单。

' In this class will be collected all distinct value of all columns
' Create own property for every column which used in the ComboBoxes 
' With HashSet only distinct values will be collected (thanks to @Ivan Stoev's comment)
Public Class TblLabelProperties
    Public Property LabelId As New HashSet(Of Integer)
    Public Property Description As New HashSet(Of String)
    ' Other properties/columns
End Class

' Populate collections from database
Dim ts As IEnumerable(Of tblLabel)

Dim columnsValues As TblLabelProperties = 
        ts.Aggregate(New TblLabelProperties(),
                     Function(lists, label)
                         lists.LabelId.Add(label.LabelId)
                         lists.Description.Add(label.Description)
                         'Add other properties
                         Return lists
                     End Function)

' Set DataSources of comboboxes
CmbLabelId.DataSource = columnsValues.LabelId.ToList()
CmbDescription.DataSource = columnsValues.Description.ToList()

答案 1 :(得分:1)

在不将每个数据源放到每个ComboBox的情况下实现此目的的一种方法是在DataGridView.Columns中的列名称和组合框名称ComboBox.Name之间实现映射。

可以使用Dictionary来完成此操作,因此对于每个列名,您都会映射到特定的ComboBox。然后,您可以通过foreach或for循环进行填充。

然而,在某些情况下,你真的可能更喜欢每个ComboBox都有自己的数据源