vb.net根据之前2个组合框中的选定项目更改组合框选项

时间:2016-01-13 19:49:05

标签: vb.net winforms visual-studio combobox visual-studio-2015

我正在创建一个程序,有人可以将搜索输入文本框,然后使用一系列组合框缩小结果(或者只使用组合框来搜索所有内容)。

该程序如下所示:form 1

我已使用以下代码在第二个组合框更改中进行了选项:

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    Dim type As String = ComboBox1.SelectedItem
    Dim make As String = ComboBox2.SelectedItem
    Dim model As String = ComboBox3.SelectedItem
    Dim version As String = TextBox2.Text
    Dim memory As String = TextBox3.Text
    Dim problem As String = TextBox4.Text
    Dim casenumber As Integer = Int(Rnd() * 9999) + 1000
    If type = "Phone" Then
        ComboBox2.Items.Clear()
        Dim file As New System.IO.StreamReader("E: \phone.txt")
        For i = 1 To 20
            q(i) = file.ReadLine() & vbNewLine
            ComboBox2.Items.Add(q(i))
        Next
    ElseIf type = "Tablet" Then
        ComboBox2.Items.Clear()
        Dim file As New System.IO.StreamReader("E:\tablet.txt")
        For i = 1 To 20
            q(i) = file.ReadLine() & vbNewLine
            ComboBox2.Items.Add(q(i))
        Next
    ElseIf type = "Desktop computer" Then
        ComboBox2.Items.Clear()
        Dim file As New System.IO.StreamReader("E:\pc.txt")
        For i = 1 To 20
            q(i) = file.ReadLine() & vbNewLine
            ComboBox2.Items.Add(q(i))
        Next
    ElseIf type = "Laptop" Then
        ComboBox2.Items.Clear()
        Dim file As New System.IO.StreamReader("E:\laptop.txt")
        For i = 1 To 20
            q(i) = file.ReadLine() & vbNewLine
            ComboBox2.Items.Add(q(i))
        Next
        'Else
        'Dim objwriter As System.IO.StreamWriter
        'objwriter = My.Computer.FileSystem.OpenTextFileWriter("E:\unknown.txt", True)
        'File.AppendText("type:" And ComboBox1.Text And "make" & ComboBox2.Text And "model: " & ComboBox3.Text And "version: " And TextBox2.Text & "memory" And TextBox3.Text)
    End If
End Sub

但是,代码无法改变第3个框中的内容。我为每个选项重复了以下代码:

Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox3.SelectedIndexChanged
    Dim type As String = ComboBox1.SelectedItem
    Dim make As String = ComboBox2.SelectedItem
    Dim model As String = ComboBox3.SelectedItem
    Dim version As String = TextBox2.Text
    Dim memory As String = TextBox3.Text
    Dim problem As String = TextBox4.Text
    If type = "Phone" Then
        If make = "apple" Then
            ComboBox2.Items.Clear()
            Dim file As New System.IO.StreamReader("E:\apple.txt")
            For i = 1 To 20
                q(i) = file.ReadLine() & vbNewLine
                ComboBox3.Items.Add(q(i))
            Next
        ElseIf make = "samsung" Then
            ComboBox2.Items.Clear()
            Dim file As New System.IO.StreamReader("E:\samsung.txt")
            For i = 1 To 20
                q(i) = file.ReadLine() & vbNewLine
                ComboBox3.Items.Add(q(i))
            Next
        ElseIf make = "htc" Then
            ComboBox2.Items.Clear()
            Dim file As New System.IO.StreamReader("E:\htc.txt")
            For i = 1 To 20
                q(i) = file.ReadLine() & vbNewLine
                ComboBox3.Items.Add(q(i))
            Next
        ElseIf make = "Nokia" Then
            ComboBox2.Items.Clear()
            Dim file As New System.IO.StreamReader("E:\Nokia.txt")
            For i = 1 To 20
                q(i) = file.ReadLine() & vbNewLine
                ComboBox3.Items.Add(q(i))
            Next
        ElseIf make = "Blackberry" Then
            ComboBox2.Items.Clear()
            Dim file As New System.IO.StreamReader("E:\blackberry.txt")
            For i = 1 To 20
                q(i) = file.ReadLine() & vbNewLine
                ComboBox3.Items.Add(q(i))
            Next

我已经检查过显而易见的问题,例如输入错误的文本文件名和大写字母等,但无论我做什么都无法解决这个问题。

有没有人知道为什么第三个组合框保持空白,即使满足两个条件(combobox1和2都选择了正确的选项)?任何建议都会非常感激。

1 个答案:

答案 0 :(得分:0)

首先我怀疑这段代码: -

Dim type As String = ComboBox1.SelectedItem.ToString
Dim make As String = ComboBox2.SelectedItem.ToString
Dim model As String = ComboBox3.SelectedItem.ToString
Dim version As String = TextBox2.Text
Dim memory As String = TextBox3.Text
Dim problem As String = TextBox4.Text
如果您的活动,

不应该在每个活动中。在选择了所有信息之后,它们应该被放置在某个地方吗?

确定开始将其粘贴到名为" device type.txt"

的文本文件中
  

电话,E:\ phone.txt
  平板电脑,E:\ tablet.txt
  台式计算机,E:\ pc.txt
  笔记本电脑,E:\ laptop.txt

然后编辑您的phones.txt文件和上述其他文件以匹配该格式,例如此phone.txt文件

  

苹果,E:\ apple.txt
  三星,E:\ samsung.txt
  HTC,E:\ htc.txt
  诺基亚,E \ nokia.txt
  黑莓,E:\ blackberry.txt

链接到另一个文件的每个项目的

等等。对于树中的最后一个文件 - 我认为这些文件包含每个品牌手机的模型列表,只需将它们保留为简单列表即可。每个模型后都没有逗号或任何内容。

使用此代码来填充每个ComboBox

Private Sub PopulateComboBox(ByRef cboBox As ComboBox, ByVal itemSource As String)
    RemoveHandler ComboBox1.SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged
    RemoveHandler ComboBox2.SelectedIndexChanged, AddressOf ComboBox2_SelectedIndexChanged
    RemoveHandler ComboBox3.SelectedIndexChanged, AddressOf ComboBox3_SelectedIndexChanged
    Dim devices As New List(Of item)
    Dim csvFlag As Boolean = False
    cboBox.Items.Clear()
    Using MyReader As New Microsoft.VisualBasic.
        FileIO.TextFieldParser(itemSource)
        If MyReader.ReadLine.Contains(",") Then csvFlag = True
    End Using

    Using MyReader As New Microsoft.VisualBasic.
        FileIO.TextFieldParser(itemSource)
        If csvFlag Then
            MyReader.TextFieldType = FileIO.FieldType.Delimited
            MyReader.SetDelimiters(",")
        End If
        Dim currentRow As String() = {"", ""}
        While Not MyReader.EndOfData
            Try
                If csvFlag Then
                    currentRow = MyReader.ReadFields()
                    Dim tempItem As New item
                    tempItem.item = currentRow(0)
                    tempItem.fileName = currentRow(1)
                    devices.Add(tempItem)
                Else
                    currentRow(0) = MyReader.ReadLine
                    Dim tempItem As New item
                    tempItem.item = currentRow(0)
                    tempItem.fileName = ""
                    devices.Add(tempItem)
                End If

            Catch ex As Microsoft.VisualBasic.
              FileIO.MalformedLineException
                MsgBox("Line " & ex.Message & "is not valid and will be skipped.")
            End Try
        End While
    End Using
    If csvFlag Then
        cboBox.DataSource = devices
    cboBox.DisplayMember = "item"
        cboBox.ValueMember = "fileName"
    Else
        cboBox.DataSource = devices
        cboBox.DisplayMember = "item"
        cboBox.ValueMember = "item"
    End If
    AddHandler ComboBox1.SelectedIndexChanged, AddressOf ComboBox1_SelectedIndexChanged
    AddHandler ComboBox2.SelectedIndexChanged, AddressOf ComboBox2_SelectedIndexChanged
    AddHandler ComboBox3.SelectedIndexChanged, AddressOf ComboBox3_SelectedIndexChanged
End Sub

它的作用是首先检查正在读取的文件是否是逗号分隔的文件。

如果它是分隔的,它将读取 itemSource 中引用的文件并期望一对值。第一个值是您在框中看到的值(DisplayMember),第二个值是点击框实际返回的值(ValueMember)

如果文件没有逗号分隔,它只会读取每一行并将其添加到组合框中,以便它正常运行(这对于树中的最后一个文件很重要)

接下来,您需要为ComboBox提供这些方法

Private Sub PopulateComboBox1()
    PopulateComboBox(ComboBox1, "E:\device type.txt")
End Sub

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    PopulateComboBox(ComboBox2, ComboBox1.SelectedValue.ToString)
End Sub

Private Sub ComboBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox2.SelectedIndexChanged
    PopulateComboBox(ComboBox3, ComboBox2.SelectedValue.ToString)
End Sub

Private Sub ComboBox3_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox3.SelectedIndexChanged
    PopulateComboBox(ComboBox3, ComboBox2.SelectedValue.ToString)
End Sub

调用方法可以在表单的加载事件中填充Combobox1。