VB.net, Ссылки на изменения, внесенные в публичные переменные в частном подпрограмме в разных частных подпрограммах - PullRequest
0 голосов
/ 22 июня 2019

В одной частной подпрограмме моей программы (openFile_Click) я вносил изменения в переменные, которые я затемнил в классе Public, под названием Names, Distance и Point.Но когда я пытаюсь перепечатать их из другого частного подпрограммы (btnGameEnter), они остаются пустыми.Я знаю, что переменные устанавливаются правильно в подпрограмме openFile после тестирования, и я не знаю, почему тот же процесс, выполняемый в подпрограмме openFile, которая добавляет переменные в список, не работает в подпрограмме btnGameEnter, где переменные должныуже есть данные из openFile.

Public Class frmdetails


    Dim Names(100) As String
    Dim Distance(100, 2) As String
    Dim Points(100, 2) As String

    Private Sub openFile_Click(sender As Object, e As EventArgs) Handles openFile.Click
        OpenFileDialog.ShowDialog()
        Dim strFileName = OpenFileDialog.FileName
        Dim objReader As New System.IO.StreamReader(strFileName)
        Dim textline As String


        lstNames.Items.Clear()
        lstDistance.Items.Clear()
        lstPoints.Items.Clear()

        Dim Count As Integer = 0


        Do While objReader.Peek() <> -1

            textline = objReader.ReadLine() & vbNewLine

            Dim parts() As String = textline.Split("|")

            Names(Count) = parts(0)
            Distance(Count, 0) = parts(1)
            Distance(Count, 1) = parts(2)
            Distance(Count, 2) = parts(3)
            Points(Count, 0) = parts(4)
            Points(Count, 1) = parts(5)
            Points(Count, 2) = parts(6)

            Count = Count + 1


        Loop

        For n = 0 To Count - 1
            lstNames.Items.Add(Names(n))
            lstNames.Items.Add(" ")
            lstDistance.Items.Add(Distance(n, 0) + " Miles")
            lstDistance.Items.Add(" ")
            lstPoints.Items.Add(Points(n, 0))
            lstPoints.Items.Add(" ")
        Next

    End Sub

    Private Sub btnGameEnter_Click(sender As Object, e As EventArgs) Handles btnGameEnter.Click

        Dim ChosenGame As Integer = 0
        Dim Count As Integer = 0

        ChosenGame = cboWhichGame.Text

        lstGameNum.Items.Clear()

        lstNames.Items.Clear()
        lstDistance.Items.Clear()
        lstPoints.Items.Clear()

        lstGameNum.Items.Add(ChosenGame)


        For n = 0 To Count - 1
            lstNames.Items.Add(Names(n))
            lstNames.Items.Add(" ")
            lstDistance.Items.Add(Distance(n, (ChosenGame - 1)) + " Miles")
            lstDistance.Items.Add(" ")
            lstPoints.Items.Add(Points(n, (ChosenGame - 1)))
            lstPoints.Items.Add(" ")
        Next

    End Sub
End Class

1 Ответ

0 голосов
/ 22 июня 2019

Я выявил следующие проблемы:

  1. В BtnGameEnter_Click вы инициализируете локальную переменную как Dim Count As Integer = 0.Его значение никогда не меняется.Это означает, что цикл for никогда не будет выполнен.Вместо этого сделайте это поле класса, чтобы разделить его со всеми подпрограммами (и удалите Dim Count из обеих подпрограмм).

    Public Class frmReferencingFields
        Dim Count As Integer = 0
        ....
    
  2. Вы должны инициализировать 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
...