在组合框中对值进行排序,而不会丢失相关的索引

时间:2015-01-09 09:12:36

标签: vb.net sorting

在我的应用中,我制作了一个从网页上获取内容的代码。 从web获得的团队名称是按顺序模式在组合框中的顺序,在读取时是这样。 我将读取的值存储在Classifica_Table中,因此我执行此代码以添加值:

For Each Team As Team_Data In Classifica_Table
        ComboBox1.Items.Add(Team.Name) 'Populate Combo Boxes with team names
 Next

现在我拥有像尤文图斯,罗马,国际米兰这样的东西,它们很乱,而且不是字母顺序。 我过去曾尝试过这样的命令:

For Each Team As Team_Data In Classifica_Table.OrderBy(Function(x) x.Name)
    ComboBox1.Items.Add(Team.Name) 
Next

这仅适用于外观,因为表中的索引会丢失。 例如,如果我有关联:

尤文图斯=> 3
罗马=> 5
Inter => 2
我发现自己:
Inter => 3
尤文图斯=> 5
罗马=> 2
应该是
Inter => 2
尤文图斯=> 3
罗马=> 5个

是否有办法对值进行排序而不会丢失与之关联的索引? 更多细节:

Dim Classifica_Table() As Team_Data

每个团队的索引与此相关:

Classifica_Table(ComboBox1.SelectedIndex).Partite_Giocate

.Partite_Giocate是在下载数据期间增强的变量。 完整的代码结构:
1。在组合框中添加数据下载:

Classifica_Table = Fill_Table(Classifica_JS)

    ComboBox1.Items.Clear()
    For Each Team As Team_Data In Classifica_Table
        ComboBox1.Items.Add(Team.Name) 'Populate Combo Boxes with team names
    Next

2。填写表会对每个"团队"的变量进行定值,因此我使用来自互联网的数据对该变量进行了定价:

            .Partite_Giocate..
            .Vincite..
            .Pareggi...
            .Perdite...
            .Goal_Segnati..
            .Goal_Subiti...

这是一个整数变量

3。组合框中每个团队的索引:

Classifica_Table(ComboBox1.SelectedIndex).Partite_Giocate

等等......那就是它。

2 个答案:

答案 0 :(得分:2)

SelectedIndex是一个跟踪组合框中所选项目位置的属性,它不能用作另一个集合中的索引。

如果要保留与显示的项目(名称)相关联的值,则应将项目添加到组合中的方法应替换为DataBinding方法;

Dim bs = new BindingSource()
bs.DataSource = Classifica_Table.OrderBy (Function(x) x.Name)
ComboBox1.DataSource = bs
ComboBox1.DisplayMember = "Name"
ComboBox1.ValueMember = "Partite_Giocate"

请记住,此方法现在需要重新评估从组合框中读取值的每个点。现在,您的ComboBox项是Team类的实例,您可以使用带有DirectCast到Team的SelectedItem属性将它们返回。要获取项的值,请阅读SelectedValue属性,依此类推......

因此,例如,如果您想跟踪组合框更改事件,您可以编写

Sub comboBox_SelectedIndexChanged(sender as Object, e as EventArgs) 
    Dim b = DirectCast(sender, ComboBox)
    if b.SelectedItem IsNot Nothing Then
        Dim t = DirectCast(b.SelectedItem, Team)
        Console.WriteLine("Partite Giocate=" & t.Partite_Giocate)

    End If 
End Sub

修改 查看您的项目,这是一个关于如何在ComboBox1的SelectedIndexChanged中更改代码的示例。在该方法中,您使用SelectedIndex值作为Classifica_Table结构数组的索引。这是错误的,当然你想要重新排列组合中团队的显示。相反,您应该尝试使用Name查找当前选定的Team_Data值,因为这是组合中的唯一值。

Private Sub ComboBox1_SelectedIndexChanged(.....) Handles ComboBox1.SelectedIndexChanged 
    If ComboBox1.SelectedIndex = ComboBox2.SelectedIndex Then 
       MsgBox(".....") 
       Exit Sub 
    End If 

    ' Get the Team_Data corresponding to the Text currently selected    
    Dim td = Classifica_Table.Where(Function(x) x.Name = ComboBox1.Text).SingleOrDefault() 
    Dim Shield As Bitmap = Bitmap.FromStream(New MemoryStream(New WebClient().DownloadData(td.Shield))) 
    Shield_1.Image = Shield 
    Rating_1_1.Value = td.Partite_Giocate 
    Rating_1_2.Value = td.Vincite 
    Rating_1_3.Value = td.Pareggi 
    Rating_1_4.Value = td.Perdite 
    Rating_1_5.Value = td.Goal_Segnati 
    Rating_1_6.Value = td.Goal_Subiti
    .....

当然,使用这种方法,您不需要使用DataBinding功能,您可以对您的团队进行排序,因为不再使用Team_Data的检索使用SelectedIndex属性

答案 1 :(得分:0)

一种方法:

首先插入所有团队,以便列出所有团队

For Each Team As Team_Data In Classifica_Table
    ComboBox1.Items.Add(Team.Name)
Next

然后将它们替换为列表中的正确位置:

For Each Team As Team_Data In Classifica_Table
    ComboBox1.Items.RemoveAt(Team.Index)
    ComboBox1.Items.Insert(Team.Index, Team.Name)
Next