2015-04-06 273 views
1

我有一个任务是在Microsoft Visual Studio Express 2012中创建一个程序,该程序打开我们创建的文本文件,并读取其中已有名称的列表。该程序应该取名称并将它们存储在一个字符串数组中,然后将它们显示在列表框中。还有一个文本框为数组添加一个名称,当程序关闭程序时应该保存数组中的名称列表。我的主要问题如下:读取和写入数据到顺序访问文本文件

  1. 如何从阵列获取的名称列表在程序启动

  2. 显示如何从文本框中添加名字到已经存在的阵列

  3. 如何将数组(带有新名称)保存到文件中?

它是一个在线课程,教师从不电子邮件回来,我们没有课本,我都可以在网络中同时向四周看了看,所以我来到这里,看看有什么我可以找出。

这是我到目前为止有:

问题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

您是否需要使用'IO.StreamWriter'库? – jwatts1980

+0

我已更新我的回答 – jwatts1980

回答

0

因为我不知道是什么你的知识水平,让我从头开始。

1a)您从Form开始,并且您有几个控件。您列出的要求是,您必须在程序打开时阅读文件。在VS2012中,在设计器模式下,当您单击表单的顶部栏时,表单的属性出现在属性框中。在属性面板中,沿着顶部边缘,您将看到一个闪电图标。点击它将显示所选控件的所有可能事件的列表(在本例中为Form)。其中一个事件是Load。如果你双击Load它会在代码中为你创建一个新的事件处理程序方法并跳转到它。

这看起来似乎是您的第一个问题的第一部分的最佳解决方案。

1b)至于从文件中读取列表,我认为这个列表是换行符分隔的吗?意思是每行有一个名字。如果是这样,我建议你看看System.IO in the File classReadLines() method将非常有帮助。

ReadLines()会给你一个文件中每一行的集合(或列表)。如果每个名称位于不同的行上,则集合中的每个项目都将是一个名称。

1c)一旦您收集了名称,您必须将它们添加到ListBox。查看ListBoxItems property。这两种方法对你有帮助的是Add() and AddRange()

2)一旦将名称列入列表中,您可以继续在控件上使用Add()来更新ListBox。你有一个TextBox用于输入新的名字,并且我假定一个按钮实际上是添加的。同样,ListBoxItems属性上的Add()方法应该对此有用。

3a)为了从ListBox得到回线,有几种方法可以做到这一点。我最喜欢的是使用System.Linq library。在.NET中使用Linq可轻松处理对象集合。值得注意的是,ListBox控件Items属性包含Object类型的集合。对于视觉表示,ListBox内部调用每个对象的ToString()方法。很明显,如果集合中的对象实际上是String类型,那么它很容易转换。这是你在这里的情况。

即便如此,您需要拨打Cast() method

Dim line As String() = listbox.Items.Cast(Of String)().ToArray() 

此行将首先将列表框中的所有项目转换为字符串,然后将该列表转换为数组。

3b)最后,您可以使用System.IO.File类中的WriteAllLines() method轻松地将该数组写回文件。

UPDATE

这解决你的问题更新:

File.AppendText()打开要添加的文件文本。您的文件已经有一些名称,并且列表框包含所有名称。追加并不是正确的答案。

此外,由于在您的示例中names是一个集合,要编写名称,您需要遍历它们。 注意:最佳做法是对具有Dispose()方法的对象使用Using声明。这些对象实现Interface,称为IDisposableUsing声明与实现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) 

这一行:

  1. 打开文件进行写入。如果它不存在,则创建它。
  2. names集合中的每个项目写入文件中它自己的行。
  3. 关闭文件。
+0

System.String []获取保存,而不是输入的实际名称。 – Stromboli

+0

执行写入的代码行是什么?您可以添加更新到您的问题,并在这里留言。 – jwatts1980

+0

@Stromboli你知道吗? – jwatts1980