我有一项任务是在Microsoft Visual Studio Express 2012中创建一个程序,打开我们创建的文本文件并读取其中已有的名称列表。该程序应该采用名称并将它们存储在一个字符串数组中,然后将它们显示在一个列表框中。还有一个文本框可以为数组添加名称,当程序关闭程序时应该保存数组中的名称列表。我的主要问题如下:
如何从阵列中获取要在程序启动时显示的名称列表
如何将文本框中的名称添加到现有数组
如何获取阵列(带有新名称)并将其保存到文件中?
这是一个在线课程,教师从不发送电子邮件,我们没有教科书,我已经在网上浏览了一段时间,所以我来这里看看我能找到的东西。
这是我到目前为止所做的:
问题1:
Public Class Form1
Dim strReader As System.IO.StreamReader
Private Sub lstNames_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lstNames.SelectedIndexChanged
strReader = New IO.StreamReader("Names.txt")
While (strReader.Peek() > -1)
lstNames.Items.Add(strReader.ReadLine)
End While
strReader.Close()
Dim nameArray() As String = lstNames.Items.OfType(Of String)().ToArray()
End Sub
问题2:我甚至不知道从哪里开始
问题3:
Private Sub saveExit_Click(sender As Object, e As EventArgs) Handles saveExit.Click
Dim strWriter As New IO.StreamWriter("Names.txt")
strWriter.Write(lstNames.Text)
strWriter.Close()
Application.Exit()
End Sub
现在作者只会保存文本文件,因为目前我无法在启动时将名称数组加载到列表框中。感谢所有评论的人,感谢您的帮助!
编辑:现在唯一的问题是更新列表框信息没有正确保存数据,它返回为System.String []这里是代码:
Private Sub saveExit_Click(sender As Object, e As EventArgs) Handles saveExit.Click
'this converts all items in listbox into strings, then into an array
Dim names As String() = lstNames.Items.Cast(Of String)().ToArray()
'This writes the data to the file
Dim strWriter As IO.StreamWriter = IO.File.AppendText("Names.txt")
strWriter.WriteLine(names)
strWriter.Close()
Application.Exit()
End Sub
答案 0 :(得分:0)
由于我不知道你的知识水平是什么,所以让我从头开始。
1a)你开始使用Form
,并且你有几个控件。您列出的要求是,您必须在程序打开时读取该文件。在VS2012中,在设计器模式下,当您单击表单的顶部栏时,表单的属性将出现在属性框中。在属性面板中,沿着顶部边缘,您将看到一个闪电图标。单击它将显示所选控件的所有可能事件的列表(在本例中为Form
)。其中一个事件是Load
。如果双击Load
,它将在代码中为您创建一个新的事件处理程序方法并跳转到它。
这似乎是第一部分问题的最佳解决方案。
1b)至于从文件中读取列表,我假设这个列表是换行符分隔的吗?意思是每行都有一个名称。如果是这样,我建议您查看System.IO
in the File
class。 ReadLines()
method非常有帮助。
ReadLines()
会返回文件中每行的集合(或列表)。如果每个名称在不同的行上,则集合中的每个项目都是名称。
1c)获得名称后,必须将它们添加到ListBox
。查看ListBox
的{{3}}。对您有帮助的两种方法是Items
property。
2)将名称输入列表后,您可以继续使用控件上的Add()
来更新ListBox
。您有一个TextBox
用于输入新名称,我假设一个按钮实际上是添加。同样,Add()
ListBox
属性上的Items
方法应该对此有用。
3a)要从ListBox
取回线路,有几种方法可以做到这一点。我最喜欢的是使用Add()
and AddRange()
。 Linq
是.NET中一种可以轻松处理对象集合的方法。需要注意的一点是,ListBox
控件Items
属性包含Object
类型的集合。对于可视化表示,ListBox
在内部调用每个对象的ToString()
方法。显然,如果集合中的对象实际上恰好是String
类型,那么它很容易转换。这就是你在这里的情况。
即便如此,您还需要System.Linq
library来电。
Dim line As String() = listbox.Items.Cast(Of String)().ToArray()
此行将首先将列表框中的所有项目转换为字符串,然后将该列表转换为数组。
3b)最后,您可以使用System.IO.File
类中的Cast()
method轻松地将该数组写回文件。
<强> 更新 强>
这解决了您的问题更新:
File.AppendText()
打开一个文件以向其添加文字。您的文件已有一些名称,列表框中包含所有名称。追加真的不是正确的答案。
此外,由于在您的示例names
是一个集合,要编写名称,您需要循环它们。
注意:最佳做法是对具有Using
方法的对象使用Dispose()
语句。这些对象实现了一个名为Interface
的{{1}}。 IDisposable
语句与实现Using
的对象具有特殊关系。它始终确保在调用IDisposable
行时,释放所有资源。
End Using
更好的选择是使用Using strWriter As IO.StreamWriter = IO.File.AppendText("Names.txt")
For Each n As String In names
strWriter.WriteLine(n)
Next
strWriter.Close()
End Using
:
File.WriteAllLines()
这一行:
IO.File.WriteAllLines("Names.txt", names)
集合中的每个项目写入文件中自己的行。