Я выявил следующие проблемы:
В BtnGameEnter_Click
вы инициализируете локальную переменную как Dim Count As Integer = 0
.Его значение никогда не меняется.Это означает, что цикл for никогда не будет выполнен.Вместо этого сделайте это поле класса, чтобы разделить его со всеми подпрограммами (и удалите Dim Count
из обеих подпрограмм).
Public Class frmReferencingFields
Dim Count As Integer = 0
....
Вы должны инициализировать ChosenGame
, который является Integer
с cboWhichGame.SelectedIndex
, где первая игра будет 0
.Поэтому не вычитайте 1 при добавлении.Это позволяет вам добавлять говорящие имена к ComboBox
вместо простых чисел.
Dim ChosenGame As Integer = cboWhichGame.SelectedIndex
...
lstDistance.Items.Add(Distance(n, ChosenGame) + " Miles")
lstPoints.Items.Add(Points(n, ChosenGame))
Кроме того, я не уверен, что вы выбрали правильные типы для расстояний иточки.Это действительно строки?
Я предлагаю другой подход.Название, расстояние и точки представляют места?Это предполагает это.Итак, давайте создадим Location
класс
Public Class Location
Property Name As String
Property Distance As Double
Property Points As Integer
End Class
У вас, кажется, есть 3 игры.Итак, давайте создадим массив игр, подобный этому, в виде
Dim game(2) As List(Of Location)
Количество игр является фиксированным, так как оно зависит от формата файла.Каждая игра содержит переменное количество локаций.Для этого лучше всего использовать List(Of T)
, так как он автоматически увеличивается в соответствии с содержимым.
Также давайте добавим удобную процедуру, которая добавляет игры в списки.Мы можем использовать его в обеих подпунктах.
Private Sub DisplayGame(game As List(Of Location))
lstNames.Items.Clear()
lstDistance.Items.Clear()
lstPoints.Items.Clear()
For Each location As Location In game
lstNames.Items.Add(location.Name)
lstNames.Items.Add(" ")
lstDistance.Items.Add(location.Distance & " Miles")
lstDistance.Items.Add(" ")
lstPoints.Items.Add(location.Points.ToString())
lstPoints.Items.Add(" ")
Next
End Sub
Обратите внимание, как мы можем представить игру с одной переменной game As List(Of Location)
и местоположением как location As Location
вместо того, чтобы иметь дело с отдельными массивами имен, расстоянийи очки.Кроме того, нет необходимости в отдельной переменной Count
, так как список автоматически отслеживает количество.
Теперь две подпрограммы становятся
Private Sub OpenFile_Click(sender As Object, e As EventArgs) Handles openFile.Click
OpenFileDialog.ShowDialog()
Dim strFileName = OpenFileDialog.FileName
'Create the lists
For i As Integer = 0 To UBound(game)
game(i) = New List(Of Location)()
Next i
For Each textline As String In File.ReadLines(strFileName)
Dim parts() As String = textline.Split("|"c)
If parts.Length = 7 Then 'Not an empty line
For g As Integer = 0 To UBound(game)
Dim location = New Location()
location.Name = parts(0)
location.Distance = CDbl(parts(1 + g))
location.Points = CInt(parts(4 + g))
game(g).Add(location)
Next g
End If
Next
DisplayGame(game(0))
End Sub
и
Private Sub BtnGameEnter_Click(sender As Object, e As EventArgs) Handles btnGameEnter.Click
Dim ChosenGame As Integer = cboWhichGame.SelectedIndex
lstGameNum.Items.Clear()
lstGameNum.Items.Add(ChosenGame)
DisplayGame(game(ChosenGame))
End Sub