如何将多个对象(同一类)保存到txt文件,并用listbox VB.NET绑定这些对象

如何将多个对象(同一类)保存到txt文件,并用listbox VB.NET绑定这些对象,vb.net,Vb.net,我尝试编写一个简单的项目,将数据保存到txt文件中,读取它并使用绑定数据显示它。我的项目是这样的 当我将ID Person添加到“添加ID”文本框(按钮“添加ID”附近的文本框)时。它会将ID添加到列表框和“ID名称”文本框中。使用这个IDName,我为第一个人插入FirstName和LastName,并保存这个人的名字。然后,我在“添加ID”文本框中添加新ID,并填写第一个、最后一个姓名,然后再次保存 我参考此页来保存数据并将其读取到txt文件。它运行正常。但我的问题是,当我用ID 2保

我尝试编写一个简单的项目,将数据保存到txt文件中,读取它并使用绑定数据显示它。我的项目是这样的

当我将ID Person添加到“添加ID”文本框(按钮“添加ID”附近的文本框)时。它会将ID添加到列表框和“ID名称”文本框中。使用这个IDName,我为第一个人插入FirstName和LastName,并保存这个人的名字。然后,我在“添加ID”文本框中添加新ID,并填写第一个、最后一个姓名,然后再次保存

我参考此页来保存数据并将其读取到txt文件。它运行正常。但我的问题是,当我用ID 2保存Person 2时,Person 1被覆盖。我想我可以把人存到名单上。但当我想更新任何人的数据时,这会变得很困难。我不知道是否有办法保存和更新每个人。顺便问一下,如何通过在listbox中绑定数据来显示数据

这是我的密码

Imports System.Runtime.Serialization.Formatters.Binary
Imports System.IO

Public Class Form1
    Public pPerson As New Person

    'Serialize and Save Data to txt file
    Private Sub SaveButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveButton.Click
        pPerson.IDName = IDNameTextBox.Text
        pPerson.FirstName = FirstNameTextBox.Text
        pPerson.LastName = LastNameTextBox.Text
        Dim fs As FileStream = New FileStream("C:\Users\Bruce\Desktop\test.txt", FileMode.OpenOrCreate)
        Dim bf As New BinaryFormatter()
        bf.Serialize(fs, pPerson)
        fs.Close()
    End Sub

    'Deserialize and Read Data from txt file 
    Private Sub ReadButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReadButton.Click
        If FileIO.FileSystem.FileExists("C:\Users\Bruce\Desktop\test.txt") Then
            Dim fsRead As New FileStream("C:\Users\Bruce\Desktop\test.txt", FileMode.Open)
            Dim bf As New BinaryFormatter()
            Dim objTest As Object = bf.Deserialize(fsRead)
            fsRead.Close()
            IDNameTextBox.Text = objTest.IDName
            FirstNameTextBox.Text = objTest.FirstName
            LastNameTextBox.Text = objTest.LastName
        End If
    End Sub

    Private Sub AddIDButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AddIDButton.Click
        ListBox1.Items.Insert(0, AddIDTextBox.Text)
        IDNameTextBox.Text = AddIDTextBox.Text
    End Sub
End Class

'Create Class Person
<System.Serializable()>
Public Class Person
    Private m_sIDName As String
    Private m_sFirstName As String
    Private m_sLastName As String

    Public Sub New()
    End Sub
    Public Property IDName() As String
        Get
            Return Me.m_sIDName
        End Get
        Set(ByVal value As String)
            Me.m_sIDName = value
        End Set
    End Property

    Public Property FirstName() As String
        Get
            Return Me.m_sFirstName
        End Get
        Set(ByVal value As String)
            Me.m_sFirstName = value
        End Set
    End Property

    Public Property LastName() As String
        Get
            Return Me.m_sLastName
        End Get
        Set(ByVal value As String)
            Me.m_sLastName = value
        End Set
    End Property

End Class
导入System.Runtime.Serialization.Formatters.Binary
导入System.IO
公开课表格1
公众人物佩尔森作为新人
'将数据序列化并保存到txt文件
Private Sub SaveButton_Click(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理SaveButton。单击
pPerson.IDName=IDNameTextBox.Text
pPerson.FirstName=FirstNameTextBox.Text
pPerson.LastName=LastNameTextBox.Text
Dim fs As FileStream=New FileStream(“C:\Users\Bruce\Desktop\test.txt”,FileMode.OpenOrCreate)
Dim bf作为新的二进制格式化程序()
bf.Serialize(fs,Perperson)
财政司司长(关闭)
端接头
'反序列化并从txt文件读取数据
Private Sub ReadButton_Click(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理ReadButton。单击
如果FileIO.FileSystem.files存在(“C:\Users\Bruce\Desktop\test.txt”),则
Dim fsRead为新文件流(“C:\Users\Bruce\Desktop\test.txt”,FileMode.Open)
Dim bf作为新的二进制格式化程序()
Dim objTest As Object=bf.反序列化(fsRead)
fsRead.Close()
IDNameTextBox.Text=objTest.IDName
FirstNameTextBox.Text=objTest.FirstName
LastNameTextBox.Text=objTest.LastName
如果结束
端接头
私有子添加按钮单击(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理添加按钮。单击
ListBox1.Items.Insert(0,AddedTextBox.Text)
IDNameTextBox.Text=添加的文本框.Text
端接头
末级
'创建类人员
公共阶层人士
私有m_sIDName作为字符串
私有m_sFirstName作为字符串
私有m_sLastName作为字符串
公共分新()
端接头
公共属性IDName()作为字符串
得到
返回我的名字
结束
设置(ByVal值作为字符串)
Me.m_sIDName=值
端集
端属性
公共属性FirstName()作为字符串
得到
返回我的名字
结束
设置(ByVal值作为字符串)
Me.m\u sFirstName=值
端集
端属性
公共属性LastName()作为字符串
得到
返回我的名字
结束
设置(ByVal值作为字符串)
Me.m_sLastName=值
端集
端属性
末级

对我来说,这里的问题似乎是

Dim fs As FileStream = New FileStream("C:\Users\Bruce\Desktop\test.txt", FileMode.OpenOrCreate)
您必须将其更改为:

If not File.Exists("C:\Users\Bruce\Desktop\test.txt") Then
File.create("C:\Users\Bruce\Desktop\test.txt")
End If
Dim fs As FileStream = New FileStream("C:\Users\Bruce\Desktop\test.txt", FileMode.Append)
整个问题是,您的文件只是打开的(或者如果以前不存在,则创建的),并且是从第一行开始写入的。通过使用FileMode.Append,您的文件将被打开,任何新文件都将尝试在文件末尾写入


让我知道这是否有效:)

为什么不使用数据库存储数据。从不建议将复杂的数据类型存储为纯文本。@Koder101:我习惯于使用数据库保存数据,但将项目放到另一台计算机上时会遇到许多问题和错误。所以,我决定试试这个方法,把它们保存到txt文件中。我认为它比数据库简单,也不那么复杂。如果您使用的是数据库,那么在另一个系统上运行时一定会遇到一些配置问题。但是,您也可以使用MS Access代替文本文件,并将其保存在文本文件所在的位置。使用MS Access很简单,也可以用来代替一个完整的数据库。我认为你是对的。也许数据库是存储和读取数据的更好方式。让我重新启动数据库。非常感谢您的精彩建议:)