[英]VB.net, Referencing changes made to public variables in a private sub within a different private subs
在我的程序的一個私有子(openFile_Click)中,我對公共類中我變暗的變量進行了更改,名為Names,Distance和Points。 但是當我試圖從另一個私人子(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
我發現了這些問題:
在BtnGameEnter_Click
您將局部變量初始化為Dim Count As Integer = 0
。 它的價值永遠不會改變。 這意味着for循環永遠不會執行。 使它成為一個類字段,而不是在所有Subs中共享它(並從兩個subs中刪除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)
,因為它會自動增長以適應內容。
另外,讓我們添加一個方便的例程,將游戲添加到列表中。 我們可以在兩個Subs中重復使用它。
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
變量,因為列表會自動跟蹤計數。
現在,兩個Subs成為了
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.