将 CSV 导入组合框,然后更改 VB 中的其他内容

Importing a CSV into a combobox, then changing other things in VB

我想要做的是导入一个 CSV 文件(名为 fwlist.txt),如下所示:

modelname,power type,pic,part number,firmware, option1, option 1, etc

最终结果,我想要一个显示模型名称的组合框,当从下拉列表中 select 编辑模型名称时,它会使用其他信息更新表单上的各种标签和文本框。

这是我目前的情况:

Dim filename As String = "fwlist.txt"
Dim pwrtype As String
Dim pic As String
Dim partnum As String
Dim lineread As String
Dim FirmwareName As String



Private Sub ReadFirmwaresLoad(sender As Object, e As EventArgs) Handles Me.Load
    ' Load the items into the NameComboBox list.
    Dim ResponseDialogResult As DialogResult

    Try

        Dim FirmwareStreamReader As StreamReader = New StreamReader(filename)
        ' Read all the elements into the list.
        Do Until FirmwareStreamReader.Peek = -1
            lineread = FirmwareStreamReader.ReadLine()
            Dim fields As String() = lineread.Split(",")
            FirmwareName = fields(0) 'Take First Field
            cbFW.Items.Add(FirmwareName)
            'Set Text labels based on position in line. 
            pwrtype = fields(1)
            pic = fields(2)
            partnum = fields(3)
            (...etc through options)
        Loop
        ' Close the file.
        FirmwareStreamReader.Close()

    Catch ex As Exception
        ' File missing.
        ResponseDialogResult = MessageBox.Show("File not Found!", "File Not Found",
            MessageBoxButtons.OK, MessageBoxIcon.Question)
        If ResponseDialogResult = DialogResult.OK Then
            ' Exit the program.
            Me.Close()
        End If
    End Try
End Sub

Private Sub cbFW_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbFW.SelectedIndexChanged
    lblPwrType.Text = pwrtype
    lblPic.Text = pic
    lblPartNum.Text = parnum
    ....etc thruogh options
End Sub

此代码有效,但只是有点。如果我 select 组合框中的任何内容,它只会给我 CSV 文件最后一行的信息 - 即使它是框中的第一个条目。我很确定我搞砸了这件事很简单..有人帮忙吗?

每次你设置一个像pwrtype这样的变量的值时,它的旧值就会被丢弃并且无法取回。即使您确实为每个变量保存了多个值,您也需要一种方法来确定哪个值与组合框中当前选定的项目相关。要解决这两个问题,您需要:

  1. 一种将来自同一行的值组合在一起的方法
  2. 一种保存从文件读取的所有值的方法,而不仅仅是最近的值

让我们从第一期开始,将值组合在一起。在下面的示例代码中,我创建了一个名为 FirmwareInfo 的结构类型来实现该目的。每个 FirmwareInfo 都有自己的 pwrtypepic

您缺少的另一块拼图是保存多个固件的方法。最简单的方法是将每个 FirmwareInfo 添加到组合框的项目列表中,而不是只添加显示字符串。组合框会将每个项目转换为 UI 中的字符串; ToString() 方法告诉它您希望如何完成此转换。

我没有 运行 这个示例代码,所以我不能保证其中没有错误,但希望它足以展示总体思路。

  Dim filename As String = "fwlist.txt"

  Structure FirmwareInfo
     Public pwrtype As String
     Public pic As String
     Public partnum As String
     Public FirmwareName As String

     Public Overrides Function ToString() As String
        Return FirmwareName
     End Function
  End Structure

  Private Sub ReadFirmwaresLoad(sender As Object, e As EventArgs) Handles Me.Load
     ' Load the items into the NameComboBox list.
     Dim ResponseDialogResult As DialogResult

     Try
        Dim FirmwareStreamReader As StreamReader = New StreamReader(filename)
        ' Read all the elements into the list.
        Do Until FirmwareStreamReader.Peek = -1
           Dim lineread = FirmwareStreamReader.ReadLine()
           Dim fields As String() = lineread.Split(",")
           Dim info As New FirmwareInfo With {
              .FirmwareName = fields(0),
              .pwrtype = fields(1),
              .pic = fields(2),
              .partnum = fields(3)
              }
           cbFW.Items.Add(info)
        Loop
        ' Close the file.
        FirmwareStreamReader.Close()

     Catch ex As Exception
        ' File missing.
        ResponseDialogResult = MessageBox.Show("File not Found!", "File Not Found",
            MessageBoxButtons.OK, MessageBoxIcon.Question)
        If ResponseDialogResult = DialogResult.OK Then
           ' Exit the program.
           Me.Close()
        End If
     End Try
  End Sub

  Private Sub cbFW_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbFW.SelectedIndexChanged
     Dim currentInfo = DirectCast(cbFW.SelectedItem, FirmwareInfo)
     lblPwrType.Text = currentInfo.pwrtype
     lblPic.Text = currentInfo.pic
     lblPartNum.Text = currentInfo.parnum
     ' ....etc through options
  End Sub

首先我们将行读入 Firmware 对象,然后我们将此 List(Of Firmware) 设置为 ComboBoxDataSource

然后我们处理 ComboBoxSelectedIndexChanged 事件,它将获取当前选择的固件并将其数据加载到 TextBox 控件。

下面是经过测试的有效示例:

Public Class Firmware

    Public Property ModelName As String
    Public Property PowerType As String
    Public Property Pic As String
    Public Property PartNumber As String
    Public Property Firmware As String
    Public Property Option1 As String

End Class

Public Class MainForm

    Private Sub btnLoad_Click(sender As Object, e As EventArgs) Handles btnLoad.Click

        Dim lines As String() = Nothing

        Try
            ' Read the file in one step
            lines = File.ReadAllLines("fwlist.txt")
        Catch ex As Exception

            Dim dialogResult As DialogResult = MessageBox.Show(Me, "File not found! Would you like to exit program?", "Error reading file", MessageBoxButtons.YesNo, MessageBoxIcon.Error, MessageBoxDefaultButton.Button2)

            If dialogResult = DialogResult.Yes Then
                Me.Close()
            End If

            Exit Sub

        End Try

        Dim firmwares As List(Of Firmware) = New List(Of Firmware)

        For Each line As String In lines

            Dim rawData As String() = line.Split({","}, StringSplitOptions.None)

            ' Create Firmware object from each line
            Dim firmware As Firmware = New Firmware() With
            {
                .ModelName = rawData(0),
                .PowerType = rawData(1),
                .Pic = rawData(2),
                .PartNumber = rawData(3),
                .Firmware = rawData(4),
                .Option1 = rawData(5)
            }

            ' We store the read firmwares into a list
            firmwares.Add(firmware)

        Next

        ' Set the list as the data source of the combobox
        ' DisplayMember indicates which property will be shown in the combobox
        With cboModelNames
            .DataSource = firmwares
            .DisplayMember = "ModelName"
        End With

    End Sub

    Private Sub cboModelNames_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboModelNames.SelectedIndexChanged

        RefreshForm()

    End Sub

    Private Sub RefreshForm()

        ' Get the selected item as Firmware object
        Dim currentFirmware As Firmware = DirectCast(cboModelNames.SelectedItem, Firmware)

        ' Refresh all the textboxes with the information
        With currentFirmware
            txtPowerType.Text = .PowerType
            txtPic.Text = .Pic
            txtPartNumber.Text = .PartNumber
            txtFirmware.Text = .Firmware
            txtOption1.Text = .Option1
        End With

    End Sub

End Class