【问题标题】:(VB.NET) display the lower half of a textfile to a listbox(VB.NET) 将文本文件的下半部分显示到列表框
【发布时间】:2019-04-20 05:19:00
【问题描述】:

我必须制作一个应用程序来组织跑步者及其团队的列表。在下面的文本文件中,我必须删除文本文件的上半部分(上半部分是列出的球队)并在列表框项目中只显示下半部分(跑步者)。

文本文件:

 # School [School Code|School Name|Coach F-Name|Coach L-Name|AD F-Name|AD L Name]
 WSHS|Worcester South High School|Glenn|Clauss|Bret|Zane
 WDHS|Worcester Dorehty High School|Ellsworth|Quackenbush|Bert|Coco
 WBCHS|Worcester Burncoat High School|Gail|Cain|Kevin|Kane
 QRHS|Quabbin Regional High School|Bob|Desilets|Seth|Desilets  
 GHS|Gardner High School|Jack|Smith|George|Fanning   
 NBHS|North Brookfield High School|Hughe|Fitch|Richard|Carey
 WHS|Winchendon High School|Bill|Nice|Sam|Adams
 AUBHS|Auburn High School|Katie|Right|Alice|Wonderland
 OXHS|Oxford High School|Mary|Cousin|Frank|Daughter
 # Roster [Bib #|School Code|Runner's F-Name|Runner's L-Name]
 101|WSHS|Sanora|Hibshman
 102|WSHS|Bridgette|Moffitt
 103|WSHS|Karine|Chunn
 104|WSHS|Shanita|Wind
 105|WSHS|Fernanda|Parsell
 106|WSHS|Albertha|Baringer
 107|WSHS|Carlee|Sowards
 108|WDHS|Maisha|Kleis
 109|WDHS|Lezlie|Berson
 110|WDHS|Deane|Rocheleau
 111|WDHS|Hang|Hodapp
 112|WDHS|Zola|Dorrough
 113|WDHS|Shalon|Mcmonigle

我有一些代码将文本文件中的每一行作为数组读取,并使用布尔变量来确定文本文件的结束位置。这适用于仅显示团队,这是我设法做到的。但我现在需要做相反的事情,只显示球员,我有点难过。

我的代码:

   Private Sub btnLoadTeams_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoadTeam.Click
    ' This routine loads the lstTeam box from an ASCII .txt file
    ' # School [School Code | Name | Coach F-Name| Coach L-Name | AD F-Name | AD L-Name]

    Dim strRow As String
    Dim bolFoundCode As Boolean = False
    Dim bolEndCode As Boolean = False
    Dim bolFoundDup As Boolean = False
    Dim intPosition As Integer
    Dim intPosition2 As Integer
    Dim strTeamCodeIn As String
    Dim textIn As New StreamReader( _
        New FileStream(txtFilePath.Text, FileMode.OpenOrCreate, FileAccess.Read))
    ' Clear Team listbox
    lstTeam.Items.Clear()
    btnDeleteRunner.Enabled = True

    Do While textIn.Peek <> -1 And Not bolEndCode
        Me.Refresh()
        strRow = textIn.ReadLine.Trim
        If Not bolFoundCode Then
            If "# SCHOOL " = UCase(Mid(strRow, 1, 9)) Then
                bolFoundCode = True
            End If
        Else
            If Mid(strRow, 1, 2) <> "# " Then
                For Each item As String In lstTeam.Items
                    intPosition = InStr(1, strRow, "|")
                    strTeamCodeIn = Mid(strRow, 1, intPosition - 1)
                    intPosition2 = InStr(1, item, strTeamCodeIn)

                    If intPosition2 > 0 Then
                        bolFoundDup = True
                        MsgBox("Found Duplicate School Code: " & strTeamCodeIn)

                    End If
           Else
               bolEndCode = True
                Next

                If Not bolFoundDup Then
                    lstTeam.Items.Add(strRow)

                Else
                    lstTeam.Items.Add("DUPLICATE School Code: " & strRow)
                    lstTeam.Items.Add("Please correct input file and reload teams")
                    bolEndCode = True
                End If
            End If
        End If
    Loop

End Sub

我将 bolEndCode = True 放在读取文本文件中间部分的部分之间,但我设法在列表框中显示以下内容:

 # Roster [Bib #|School Code|Runner's F-Name|Runner's L-Name]

任何关于如何在“lstPlayers”列表框中仅显示跑步者的帮助或提示将不胜感激。我是一名初级程序员,我们才刚刚开始在我的 .NET 课程中学习读写数组。

【问题讨论】:

    标签: arrays vb.net text-files read-write


    【解决方案1】:

    首先我做了 2 个班级,一个 Runner 和一个 School。这些具有文本文件中可用的属性。作为课程的一部分,我添加了一个覆盖 .ToString 的函数。这是给调用 .ToString 进行显示的列表框。

    接下来我做了一个函数来读取文件中的所有数据。这使用 File.ReadLines 方法非常简单。

    然后我创建了 2 个变量 List(Of T) T 代表 Type。我们的类型是跑步者和学校。我使用 List(Of T) 而不是数组,因为我不必担心列表的大小。没有 ReDim Preserve,只需继续添加项目。 FillList 方法将数据添加到列表中。首先,我必须找到学校的终点和跑步者的起点。我使用了 Array.FindIndex 方法,它有点不同,因为第二个参数是一个谓词。稍微检查一下。现在我们知道要用于每个列表的行的索引并使用 For...Next 循环。在每个循环中,都会创建一个类的实例并设置属性。最后,新对象被添加到列表中。

    最后我们用一个简单的.AddRange 和lists.ToArray 填充列表框。请注意,我们正在添加整个对象、属性和所有内容。巧妙的是我们可以从列表框项中访问属性。查看 SelectedIndexChanged 事件。你可以用 Runner 列表框做同样的事情。

    抱歉,我不能只使用您的代码。我几乎忘记了旧的 vb6 方法。 InStr、Mid 等。最好使用 .net 方法。当老板说“用 C# 重写整个应用程序”时,它会让你的代码更便携

    Public Class Runner
        Public Property BibNum As Integer
        Public Property SchoolCode As String
        Public Property FirstName As String
        Public Property LastName As String
        Public Overrides Function ToString() As String
            'The listbox will call .ToString when we add a Runner object to determin what to display
            Return $"{FirstName} {LastName}" 'or $"{LastName}, {FirstName}"
        End Function
    End Class
    
    Public Class School
        Public Property Code As String
        Public Property Name As String
        Public Property CoachFName As String
        Public Property CoachLName As String
        Public Property ADFName As String
        Public Property ADLName As String
    
        'The listbox will call .ToString when we add a School object to determin what to display
        Public Overrides Function ToString() As String
            Return Name
        End Function
    
    End Class
    
    Private Runners As New List(Of Runner)
    Private Schools As New List(Of School)
    Private Function ReadData(path As String) As String()
        Dim lines = File.ReadLines(path).ToArray
        Return lines
    End Function
    
    Private Sub FillLists(data As String())
        Dim location = Array.FindIndex(data, AddressOf FindRosterLine)
        'The first line is the title so we don't start at zero
        For index = 1 To location - 1
            Dim SplitData = data(index).Split("|"c)
            Dim Schl As New School
            Schl.Code = SplitData(0)
            Schl.Name = SplitData(1)
            Schl.CoachFName = SplitData(2)
            Schl.CoachLName = SplitData(3)
            Schl.ADFName = SplitData(4)
            Schl.ADLName = SplitData(5)
            Schools.Add(Schl)
        Next
        For index = location + 1 To data.GetUpperBound(0)
            Dim SplitData = data(index).Split("|"c)
            Dim Run As New Runner
            Run.BibNum = CInt(SplitData(0))
            Run.SchoolCode = SplitData(1)
            Run.FirstName = SplitData(2)
            Run.LastName = SplitData(3)
            Runners.Add(Run)
        Next
    End Sub
    
    Private Function FindRosterLine(s As String) As Boolean
        If s.Trim.StartsWith("# Roster") Then
            Return True
        Else
            Return False
        End If
    End Function
    
    Private Sub FillListBoxes()
        Dim arrRunners As Runner() = Runners.ToArray
        Dim arrSchools As School() = Schools.ToArray
        ListBox1.Items.AddRange(arrSchools)
        ListBox2.Items.AddRange(arrRunners)
    End Sub
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim arrRunner = ReadData("Runners.txt")
        FillLists(arrRunner)
        FillListBoxes()
    End Sub
    
    Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
        Dim Schl = DirectCast(ListBox1.SelectedItem, School)
        TextBox1.Text = Schl.CoachLName
        TextBox2.Text = Schl.Code
    End Sub
    

    【讨论】:

    • 如果我的答案提供了解决方案,请点击答案左侧的复选标记(勾号)接受它。
    • 不客气。我希望你从我的代码中得到一些新的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多