VB.Net从文本文件填充文本框

时间:2019-01-23 11:38:28

标签: vb.net

我正在创建一个库存管理系统,其中的数据存储在一个文本文件中。我可以将数据保存到文本文件,但是在跟踪器屏幕上,它应该显示当前清单,例如:制造商,处理器,视频,表格,RAM等。但是,我所有的文本框都保持空白,而我没有确定为什么。它无法正确阅读或更新文本。

frmTracker.vb

Private Sub txtManufacturer_TextChanged(sender As Object, e As EventArgs) Handles txtManufacturer.TextChanged

    Dim objMyStreamReader = System.IO.File.OpenText("inventory.txt")
    Dim strInventory = objMyStreamReader.ReadLine()

    objMyStreamReader.Close()
    txtManufacturer.AppendText(strInventory)

End Sub

这是我当前将数据保存到文本文件的方式。

frmItemEntry.vb

Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click

    Dim objMyStreamReader As System.IO.StreamReader
    Dim objMyStreamWriter As System.IO.StreamWriter = System.IO.File.CreateText("inventory.txt")

    Dim strInventory As String

    objMyStreamWriter.WriteLine(txtManufacturerEntry.Text)
    objMyStreamWriter.WriteLine(txtProcessorEntry.Text)
    objMyStreamWriter.WriteLine(txtVideoEntry.Text)
    objMyStreamWriter.WriteLine(txtFormEntry.Text)
    objMyStreamWriter.WriteLine(txtRamEntry.Text)
    objMyStreamWriter.WriteLine(txtVramEntry.Text)
    objMyStreamWriter.WriteLine(txtHdEntry.Text)
    objMyStreamWriter.WriteLine(chkWirelessEntry.CheckState)
    objMyStreamWriter.Close()

    Me.Close()

End Sub

inventory.txt中的示例

Dell
i5
Nvidia
Desktop
8
4
600
0

2 个答案:

答案 0 :(得分:0)

说实话,控件绝对不能用作程序中数据的主要存储。您确实应该创建一个类和该类的列表来存储数据。

然后,您可以从文件中将数据读取到列表中,然后从那里以表格形式显示它。

有几种浏览数据和保存更新的方法。下面的建议使用下一个和上一个项目的按钮,以及一个保存更新文件的按钮。

这完全是自我解释,但是如果您不确定某些事情,请创建一个google并学习新的知识:-D

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ReadDataFile()
    DisplayItem(0)
End Sub

Private Class InventoryItem
    Public Property Manufacturer As String
    Public Property Processor As String
    Public Property Video As String
    Public Property FormFactor As String
    Public Property Ram As String
    Public Property VRam As String
    Public Property Hd As String
    Public Property Wireless As CheckState

    Public Sub New()
        Manufacturer = ""
        Processor = ""
        Video = ""
        FormFactor = ""
        Ram = ""
        VRam = ""
        Hd = ""
        Wireless = CheckState.Unchecked
    End Sub
End Class

Dim Inventory As New List(Of InventoryItem)
Dim currentItemIndex As Integer

Private Sub ReadDataFile()
    Using objMyStreamReader As New StreamReader("k:\inventory.txt")
        Do Until objMyStreamReader.EndOfStream
            Dim newItem As New InventoryItem
            newItem.Manufacturer = objMyStreamReader.ReadLine()
            newItem.Processor = objMyStreamReader.ReadLine()
            newItem.Video = objMyStreamReader.ReadLine()
            newItem.FormFactor = objMyStreamReader.ReadLine()
            newItem.Ram = objMyStreamReader.ReadLine()
            newItem.VRam = objMyStreamReader.ReadLine()
            newItem.Hd = objMyStreamReader.ReadLine()
            Dim wirelessValue As String = objMyStreamReader.ReadLine()
            If wirelessValue = "0" Then
                newItem.Wireless = CheckState.Unchecked
            ElseIf wirelessValue = "1" Then
                newItem.Wireless = CheckState.Checked
            End If
            Inventory.Add(newItem)
        Loop
    End Using
End Sub

Private Sub SaveDataFile()
    Using objMyStreamWriter As New System.IO.StreamWriter("k:\inventory.txt", False)
        For Each item As InventoryItem In Inventory
            objMyStreamWriter.WriteLine(item.Manufacturer)
            objMyStreamWriter.WriteLine(item.Processor)
            objMyStreamWriter.WriteLine(item.Video)
            objMyStreamWriter.WriteLine(item.FormFactor)
            objMyStreamWriter.WriteLine(item.Ram)
            objMyStreamWriter.WriteLine(item.VRam)
            objMyStreamWriter.WriteLine(item.Hd)
            If item.Wireless = CheckState.Checked Then
                objMyStreamWriter.WriteLine("1")
            Else
                objMyStreamWriter.WriteLine(0)
            End If
        Next
    End Using
End Sub

Private Sub DisplayItem(index As Integer)
    With Inventory(index)
        txtManufacturerEntry.Text = .Manufacturer
        txtProcessorEntry.Text = .Processor
        txtVideoEntry.Text = .Video
        txtFormEntry.Text = .FormFactor
        txtRamEntry.Text = .Ram
        txtVramEntry.Text = .VRam
        txtHdEntry.Text = .Hd
        chkWirelessEntry.CheckState = .Wireless
    End With
End Sub

Private Sub BtnUpdateItem_Click(sender As Object, e As EventArgs) Handles BtnUpdateItem.Click
    With Inventory(currentItemIndex)
        .Manufacturer = txtManufacturerEntry.Text
        .Processor = txtProcessorEntry.Text
        .Video = txtVideoEntry.Text
        .FormFactor = txtFormEntry.Text
        .Ram = txtRamEntry.Text
        .VRam = txtVramEntry.Text
        .Hd = txtHdEntry.Text
        .Wireless = chkWirelessEntry.CheckState
    End With
    SaveDataFile()
End Sub

Private Sub BtnPreviousItem_Click(sender As Object, e As EventArgs) Handles BtnPreviousItem.Click
    If currentItemIndex > 0 Then
        currentItemIndex -= 1
        DisplayItem(currentItemIndex)
    End If
End Sub

Private Sub BtnNextItem_Click(sender As Object, e As EventArgs) Handles BtnNextItem.Click
    If currentItemIndex < Inventory.Count - 1 Then
        currentItemIndex -= 1
        DisplayItem(currentItemIndex)
    End If
End Sub

答案 1 :(得分:0)

首先更改文本文件的格式。

Dell,i5,Nvidia,Desktop,8,2,600,True 
Acer,i7,Intel,Desktop,16,4,1GB,True 
HP,Pentium,Diamond Viper,Desktop,4,2,200,False 
Surface Pro,i7,Intel,Laptop,8,2,500,True

每行都是一条记录,记录中的每个字段都用逗号分隔(没有空格,因此我们不必在代码中修剪。)(字段内的空格可以,请注意Surface Pro)。

现在更容易用代码读取文件。

此解决方案使用BindingSourceDataBindings。这样可以简化导航以及编辑和保存数据。

Public Class Form5

Private bs As BindingSource
Private dt As New DataTable

#Region "Set Up the Form"
Private Sub Form5_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    AddColumnsToDataTable()
    FillDataTable()
    AddDataBindings()
End Sub

Private Sub AddColumnsToDataTable()
    'Prepare the DataTable to hold data
    dt.Columns.Add("Manufacturer", GetType(String))
    dt.Columns.Add("Processor", GetType(String))
    dt.Columns.Add("Video", GetType(String))
    dt.Columns.Add("Form", GetType(String))
    dt.Columns.Add("RAM", GetType(String))
    dt.Columns.Add("VRAM", GetType(String))
    dt.Columns.Add("HD", GetType(String))
    dt.Columns.Add("Wireless", GetType(Boolean))
End Sub

Private Sub FillDataTable()
    'ReadAllLines returns an array of the lines in a text file
    'inventory.txt is stored in the bin\Debug folder of your project
    'This is the current directory so it does not require a full path.
    Dim lines = File.ReadAllLines("inventory.txt")
    'Now it is easy to split each line into fields by using the comma
    For Each line As String In lines
        'Split returns an array of strings with the value of each field
        Dim items = line.Split(","c)
        'Each item in the array can be added as a field to the DataTable row
        dt.Rows.Add(items(0), items(1), items(2), items(3), items(4), items(5), items(6), CBool(items(7)))
        'Notice that the last element is changed from a string to a boolean. This is
        'the Wireless field which is bound to the check box. The string "True" or "False" is
        'changed to a Boolean so it can be used as the .Checked property (see bindings)
    Next
End Sub

Private Sub AddDataBindings()
    'Create a new instance of the BindingSource class
    bs = New BindingSource()
    'Set the DataSource to the DataTable we just filled
    bs.DataSource = dt
    'Now you can set the bindings of each control
    'The .Add method takes (Name of Property to Bind, the BindingSource to use, The Field name  
    'from the DataTable.
    txtForm.DataBindings.Add("Text", bs, "Form")
    txtHd.DataBindings.Add("Text", bs, "HD")
    txtManufacturer.DataBindings.Add("Text", bs, "Manufacturer")
    txtProcessor.DataBindings.Add("Text", bs, "Processor")
    txtRam.DataBindings.Add("Text", bs, "RAM")
    txtVideo.DataBindings.Add("Text", bs, "Video")
    txtVram.DataBindings.Add("Text", bs, "VRAM")
    'Notice on the CheckBox we are using the Checked property.
    chkWireless.DataBindings.Add("Checked", bs, "Wireless")
End Sub
#End Region

Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
    'Add a blank row to the DataTable
    'A Boolean is like a number, a String can be Nothing but a Boolean must 
    'have a value so we pass in False.
    dt.Rows.Add(Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, False)
    'Find the position of the last row
    Dim i As Integer = bs.Count - 1
    'Move to the new empty row
    bs.Position = i
End Sub

#Region "Navigation Code"
Private Sub btnPrevious_Click(sender As Object, e As EventArgs) Handles btnPrevious.Click
    'The binding source Position determins where in the data you are
    'It starts at zero
    If bs.Position = 0 Then
        MessageBox.Show("This is the first item.")
        Return 'This exits the sub, you can use Exit Sub in vb
        'but Return is common in other languages so it is good to learn
    Else
        'As the position of the BindingSource changes the boud TextBoxes 
        'change their data.
        bs.Position = bs.Position - 1
    End If
End Sub

Private Sub btnNext_Click(sender As Object, e As EventArgs) Handles btnNext.Click
    ' If you are not at the end of the list, move to the next item
    ' in the BindingSource.
    If bs.Position + 1 < bs.Count Then
        bs.MoveNext()
        ' Otherwise, move back to the first item.
    Else
        bs.MoveFirst()
    End If
End Sub
#End Region

#Region "Save the Data"
Private Sub SaveDataTable()
    'Resave the whole file if this was a real app you would use a database
    Dim sb As New StringBuilder
    'A string builder keeps the code from creating lots of new strings
    'Strings are immutable (can't be changed) so every time you think you are
    'changing a string, you are actually creating a new one.
    'The string builder is mutable (changable)
    For Each row As DataRow In dt.Rows
        'The ItemsArray returns an array of objects containing all the 
        'values in each column of the data table.
        Dim rowValues = row.ItemArray
        'This is a bit of Linq magic that turns the values (objects) into strings
        'Underneath it is performing a For loop on each object in the array
        Dim strRowValues = From o In rowValues
                           Select Convert.ToString(o)
        'Now that we have strings we can use the String.Join with the comma
        'to get the format of the text file
        sb.AppendLine(String.Join(",", strRowValues))
    Next
    'Finally we change the StringBuilder to a real String
    'The inventory.txt is stored in the bin\Debug directory so it is current directory
    'no additional path required
    File.WriteAllText("inventory.txt", sb.ToString)
End Sub

Private Sub Form5_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    'Because our binding is two-way any additions or changes to the text
    'in the text boxes or check box are reflected in the DataTable.
    SaveDataTable()
End Sub
#End Region

End Class

删除注释后,此处实际上只有很少的代码。 #Region...#End Region标记可让您轻松折叠不使用的代码段并快速查找区域。