Listbox 如何使用Streamreader将.txt文件中的不同文本行读取到不同的列表框中?

Listbox 如何使用Streamreader将.txt文件中的不同文本行读取到不同的列表框中?,listbox,streamreader,streamwriter,Listbox,Streamreader,Streamwriter,如果已经有人问过,请原谅我。我已经能够从一个.txt文件中找到大量关于写入列表框的信息,这非常简单。我似乎找不到太多的信息,就是将文本读回多个列表框,确切地说是10个。在过去的12个小时里我一直在做这个,我放弃了。我做什么都不管用。要么将所有列表框行放入第一个testListBox,要么当我尝试使用if…then语句时,不显示。我尝试了太多的东西,在这里列出。我的程序总共有10个列表框,但我只尝试了前两个。如果我能让它们正常运行,那么剩下的应该很容易。这就是为什么有10个列表框被编写,只有2个被

如果已经有人问过,请原谅我。我已经能够从一个.txt文件中找到大量关于写入列表框的信息,这非常简单。我似乎找不到太多的信息,就是将文本读回多个列表框,确切地说是10个。在过去的12个小时里我一直在做这个,我放弃了。我做什么都不管用。要么将所有列表框行放入第一个testListBox,要么当我尝试使用if…then语句时,不显示。我尝试了太多的东西,在这里列出。我的程序总共有10个列表框,但我只尝试了前两个。如果我能让它们正常运行,那么剩下的应该很容易。这就是为什么有10个列表框被编写,只有2个被读取的原因。这是我的写代码和读代码:

   ' handles saveButton Click
   Public Sub saveButton_Click(sender As Object, e As EventArgs) Handles saveButton.Click

  SaveFileDialog1.InitialDirectory = "c:\users\jeremy\desktop"
  SaveFileDialog1.FileName = (nameOfCourseTextBox.Text)
  SaveFileDialog1.Filter = "Text File ONLY (*.txt)|*.txt"
  SaveFileDialog1.ShowDialog()

  Dim SW As New StreamWriter(SaveFileDialog1.FileName)
  Dim i As Integer

  SW.WriteLine(nameOfCourseTextBox.Text)
  SW.WriteLine(creditsTextBox.Text)
  SW.WriteLine(testTypeLabel.Text)
  SW.WriteLine(testWeightLabel.Text)
  SW.WriteLine(attendanceTypeLabel.Text)
  SW.WriteLine(attendanceWeightLabel.Text)
  SW.WriteLine(assignmentTypeLabel.Text)
  SW.WriteLine(assignmentWeightLabel.Text)
  SW.WriteLine(otherTypeLabel.Text)
  SW.WriteLine(otherWeightLabel.Text)
  SW.WriteLine(projectTypeLabel.Text)
  SW.WriteLine(projectWeightLabel.Text)
  SW.WriteLine(aTextBox.Text)
  SW.WriteLine(bTextBox.Text)
  SW.WriteLine(cTextBox.Text)
  SW.WriteLine(dTextBox.Text)
  SW.WriteLine(fTextBox.Text)
  For i = 0 To testListBox.Items.Count - 1
     SW.Write(testListBox.Items.Item(i) & ",")
  Next
  For i = 0 To gradeTestListBox.Items.Count - 1
     SW.Write(gradeTestListBox.Items.Item(i) & ",")
  Next
  For i = 0 To assignmentListBox.Items.Count - 1
     SW.WriteLine(assignmentListBox.Items.Item(i))
  Next
  For i = 0 To gradeAssignmentListBox.Items.Count - 1
     SW.WriteLine(gradeAssignmentListBox.Items.Item(i))
  Next
  For i = 0 To attendanceListBox.Items.Count - 1
     SW.WriteLine(attendanceListBox.Items.Item(i))
  Next
  For i = 0 To gradeAttendanceListBox.Items.Count - 1
     SW.WriteLine(gradeAttendanceListBox.Items.Item(i))
  Next
  For i = 0 To projectListBox.Items.Count - 1
     SW.WriteLine(projectListBox.Items.Item(i))
  Next
  For i = 0 To gradeProjectListBox.Items.Count - 1
     SW.WriteLine(gradeProjectListBox.Items.Item(i))
  Next
  For i = 0 To otherListBox.Items.Count - 1
     SW.WriteLine(otherListBox.Items.Item(i))
  Next
  For i = 0 To gradeOtherListBox.Items.Count - 1
     SW.WriteLine(gradeOtherListBox.Items.Item(i))
  Next
  SW.Close()

   End Sub ' saveButton_Click

   Public Sub openFileButton_Click(sender As Object, e As EventArgs) Handles     openFileButton.Click

  OpenFileDialog1.InitialDirectory = "c:\users\jeremy\desktop"
  OpenFileDialog1.Filter = "Text File ONLY (*txt)|*txt"
  OpenFileDialog1.ShowDialog()

  Dim SR As New StreamReader(OpenFileDialog1.FileName)

  nameOfCourseTextBox.Text = SR.ReadLine
  creditsTextBox.Text = SR.ReadLine
  testTypeLabel.Text = SR.ReadLine
  testWeightLabel.Text = SR.ReadLine
  attendanceTypeLabel.Text = SR.ReadLine
  attendanceWeightLabel.Text = SR.ReadLine
  assignmentTypeLabel.Text = SR.ReadLine
  assignmentWeightLabel.Text = SR.ReadLine
  otherTypeLabel.Text = SR.ReadLine
  otherWeightLabel.Text = SR.ReadLine
  projectTypeLabel.Text = SR.ReadLine
  projectWeightLabel.Text = SR.ReadLine
  aTextBox.Text = SR.ReadLine
  bTextBox.Text = SR.ReadLine
  cTextBox.Text = SR.ReadLine
  dTextBox.Text = SR.ReadLine
  fTextBox.Text = SR.ReadLine
  Do While (SR.Peek() > -1)
     testListBox.Items.Add(SR.ReadLine)
  Loop
  Do While (SR.Peek() > -1)
     gradeTestListBox.Items.Add(SR.ReadLine)
  Loop
我只是在学习VisualBasic,这是我这门编程课的第一学期。我正在使用Visual Basic 2013。我意识到我有很多东西要学。我知道我仍然需要添加评论什么的,但我真的只是想在继续学习课程的其他方面之前,克服这个特殊的问题

例如,我曾尝试向testListBox.items添加前缀,但当我尝试在StreamReader部分使用任何类型的if…then语句来指定该行的位置时,列表框中没有显示任何内容。除此之外,我不知道如何在特定的列表框中写入特定的行。有人能帮我吗?我已经读了很多关于使用listview而不是listbox的内容,但是我已经花了很多时间来设置所有这些,如果有其他方法可以实现的话,我真的不想重复这么多。

编辑:所以,我去掉了逗号,现在唯一的事情是它把testListBox.items放在所有的列表框中。这是因为我不再进行循环,还是因为缺少您提到的string.join?如果我将循环添加回混合中,程序就会卡住。如何解释什么列表框中应该包含的内容?或者我应该把它扔掉,因为我=。。。那么,写部分的语句是什么

     ' handles saveButton Click
     Public Sub saveButton_Click(sender As Object, e As EventArgs) Handles       saveButton.Click

  SaveFileDialog1.InitialDirectory = "c:\users\jeremy\desktop"
  SaveFileDialog1.FileName = (nameOfCourseTextBox.Text)
  SaveFileDialog1.Filter = "Text File ONLY (*.txt)|*.txt"
  SaveFileDialog1.ShowDialog()

  Dim SW As New StreamWriter(SaveFileDialog1.FileName)
  Dim i As Integer

  SW.WriteLine(nameOfCourseTextBox.Text)
  SW.WriteLine(creditsTextBox.Text)
  SW.WriteLine(testTypeLabel.Text)
  SW.WriteLine(testWeightLabel.Text)
  SW.WriteLine(attendanceTypeLabel.Text)
  SW.WriteLine(attendanceWeightLabel.Text)
  SW.WriteLine(assignmentTypeLabel.Text)
  SW.WriteLine(assignmentWeightLabel.Text)
  SW.WriteLine(otherTypeLabel.Text)
  SW.WriteLine(otherWeightLabel.Text)
  SW.WriteLine(projectTypeLabel.Text)
  SW.WriteLine(projectWeightLabel.Text)
  SW.WriteLine(aTextBox.Text)
  SW.WriteLine(bTextBox.Text)
  SW.WriteLine(cTextBox.Text)
  SW.WriteLine(dTextBox.Text)
  SW.WriteLine(fTextBox.Text)
  For i = 0 To testListBox.Items.Count - 1
     SW.Write(testListBox.Items.Item(i) & ",")
  Next i
  SW.WriteLine() ' creats new line
  For i = 0 To gradeTestListBox.Items.Count - 1
     SW.Write(gradeTestListBox.Items.Item(i) & ",")
  Next i
  SW.WriteLine() ' creats new line
  For i = 0 To assignmentListBox.Items.Count - 1
     SW.Write(assignmentListBox.Items.Item(i))
  Next i
  SW.WriteLine() ' creats new line
  For i = 0 To gradeAssignmentListBox.Items.Count - 1
     SW.Write(gradeAssignmentListBox.Items.Item(i))
  Next
  SW.WriteLine() ' creats new line
  For i = 0 To attendanceListBox.Items.Count - 1
     SW.Write(attendanceListBox.Items.Item(i))
  Next
  SW.WriteLine() ' creats new line
  For i = 0 To gradeAttendanceListBox.Items.Count - 1
     SW.Write(gradeAttendanceListBox.Items.Item(i))
  Next
  SW.WriteLine() ' creats new line
  For i = 0 To projectListBox.Items.Count - 1
     SW.Write(projectListBox.Items.Item(i))
  Next
  SW.WriteLine() ' creats new line
  For i = 0 To gradeProjectListBox.Items.Count - 1
     SW.Write(gradeProjectListBox.Items.Item(i))
  Next
  SW.WriteLine() ' creats new line
  For i = 0 To otherListBox.Items.Count - 1
     SW.Write(otherListBox.Items.Item(i))
  Next
  SW.WriteLine() ' creats new line
  For i = 0 To gradeOtherListBox.Items.Count - 1
     SW.Write(gradeOtherListBox.Items.Item(i))
  Next
  SW.WriteLine() ' creats new line
  SW.Close()

    End Sub ' saveButton_Click

     Public Sub openFileButton_Click(sender As Object, e As EventArgs) Handles       openFileButton.Click

  OpenFileDialog1.InitialDirectory = "c:\users\jeremy\desktop"
  OpenFileDialog1.Filter = "Text File ONLY (*txt)|*txt"
  OpenFileDialog1.ShowDialog()

  Dim SR As New StreamReader(OpenFileDialog1.FileName)

  nameOfCourseTextBox.Text = SR.ReadLine
  creditsTextBox.Text = SR.ReadLine
  testTypeLabel.Text = SR.ReadLine
  testWeightLabel.Text = SR.ReadLine
  attendanceTypeLabel.Text = SR.ReadLine
  attendanceWeightLabel.Text = SR.ReadLine
  assignmentTypeLabel.Text = SR.ReadLine
  assignmentWeightLabel.Text = SR.ReadLine
  otherTypeLabel.Text = SR.ReadLine
  otherWeightLabel.Text = SR.ReadLine
  projectTypeLabel.Text = SR.ReadLine
  projectWeightLabel.Text = SR.ReadLine
  aTextBox.Text = SR.ReadLine
  bTextBox.Text = SR.ReadLine
  cTextBox.Text = SR.ReadLine
  dTextBox.Text = SR.ReadLine
  fTextBox.Text = SR.ReadLine

  Dim S As String() = SR.ReadLine.Split(New Char() {","c})
  testListBox.Items.AddRange(S)
  gradeTestListBox.Items.AddRange(S)
  assignmentListBox.Items.AddRange(S)
  gradeAssignmentListBox.Items.AddRange(S)
  SR.Close()

     End Sub

虽然我会选择以明显不同的方式编写此代码,但您已经非常接近您所寻找的解决方案。当您用此代码写出列表框时

For i = 0 To testListBox.Items.Count - 1
     SW.Write(testListBox.Items.Item(i) & ",")
Next
SW.WriteLine(); // <<-- Create a new line...
For i = 0 To gradeTestListBox.Items.Count - 1
     SW.Write(gradeTestListBox.Items.Item(i) & ",")
Next
有关VB.NET和Split的示例,请参见本页。

编辑 唯一要做的就是为每个列表框添加readline调用,如下所示:

Dim S As String() = SR.ReadLine.Split(New Char() {","c})
testListBox.Items.AddRange(S)
S = SR.ReadLine().Split(New Char() {","c})
gradeTestListBox.Items.AddRange(S)
S = SR.ReadLine().Split(New Char() {","c})
assignmentListBox.Items.AddRange(S)
S = SR.ReadLine().Split(New Char() {","c})
gradeAssignmentListBox.Items.AddRange(S)

好的,streamreader/writer不在我的类的范围之内。这个程序是一个项目,虽然我对它很满意,它满足了所有的要求,但如果我不能保存并打开它,那么它对我个人来说毫无价值。这就是为什么我一直在努力学习这些额外的东西。也就是说,我几乎没有掌握streamreader/writer的本质,因此String.split和String.join就在我的头顶上。你能给我举个例子吗?我一直在想办法,但就是无法同步。如果没有,我会继续努力解决。谢谢你的回复。我在答案中添加了更多的示例代码来解释每个建议。好的,我已经尝试合并你的建议,但它不起作用。我已经编辑了我原来的帖子,添加了我的新代码以及对不起作用的解释。希望我快到了。我做错什么了?是的,你很接近。代码按照您看到的顺序执行。因此,必须按照写入数据的顺序读取数据,这意味着执行读取和拆分的行太早了。因为您是在fTextbox之后写入testListBox项,所以必须在读取fTextbox的内容之后读取这些项。将以下行:Dim S As String=SR.ReadLine.SplitNew Char{,c}…向下移动到此行之前:testListBox.Items.AddRangeS。此外,您还需要为每个列表框添加相同类型的调用。此外,您不需要更改其他WriteLine调用。它们与最初一样好,如下所示:SW.WriteLinenameOfCourseTextBox.Text SW.writelineReceditStextBox.Text SW.WriteLinetestTypeLabel.Text SW.WriteLinetestWeightLabel.Text SW.WriteLineattendanceTypeLabel.Text SW.WriteLineattendanceWeightLabel.Text SW.writelineAsignmentTypeLabel.Text
Dim S As String() = SR.ReadLine.Split(New Char() {","c})
testListBox.Items.AddRange(S)
S = SR.ReadLine().Split(New Char() {","c})
gradeTestListBox.Items.AddRange(S)
S = SR.ReadLine().Split(New Char() {","c})
assignmentListBox.Items.AddRange(S)
S = SR.ReadLine().Split(New Char() {","c})
gradeAssignmentListBox.Items.AddRange(S)