簡體   English   中英

VB.net,引用對不同私有子中的私有子中的公共變量所做的更改

[英]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

我發現了這些問題:

  1. BtnGameEnter_Click您將局部變量初始化為Dim Count As Integer = 0 它的價值永遠不會改變。 這意味着for循環永遠不會執行。 使它成為一個類字段,而不是在所有Subs中共享它(並從兩個subs中刪除Dim Count )。

     Public Class frmReferencingFields Dim Count As Integer = 0 .... 
  2. 你應該初始化ChosenGame這是一個IntegercboWhichGame.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM