在我的应用中,我制作了一个从网页上获取内容的代码。
从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
等等......那就是它。
答案 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