1

Я создаю программу, которую кто-то может вводить поиск в текстовое поле, а затем сузить результаты, используя серию combobox (или просто использовать выпадающие списки для поиска через все).vb.net изменить параметры combobox в зависимости от выбранного элемента в двух предыдущих comboboxes

Программа выглядит следующим образом: form 1

Я сделал параметры в 2 смены, используя поле со списком следующий код:

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

Почему вы очищаете содержимое ComboBox2, а затем добавляете элементы в ComboBox3? Ваш код запутан. У вас ComboBox2_SelectedIndexChanged обработки события для ComboBox3? Могу помочь, если вы дадите свои контрольные слова значимым именам. – LarsTech

+0

я сначала очистил содержимое, так как в противном случае, если вы щелкнули не ту вещь в первом combobox, он просто добавит больше опций, а не полностью изменит их. –

+0

i поместил comboBox2_SelectedIndexChanged, обрабатывая событие для ComboBox3, поскольку я хотел изменить combobox3 в зависимости от того, что было выбрано для combobox2, поэтому я думал, что это имеет смысл –

ответ

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 

не должно быть в каждом случае ваших событий. Они действительно должны быть размещены где-то, что выполняется после того, как вся информация выбрана да?

OK для начала вставьте в текстовый файл с именем "Устройство type.txt"

Телефон, E: \ phone.txt
Tablet, E: \ tablet.txt
Настольный компьютер, E: \ pc.txt
Laptop, E: \ laptop.txt

Затем отредактируйте файл phones.txt и остальные выше файлов, чтобы соответствовать этому формату, например, этого phone.txt файла

компании Apple, E: \ apple.txt
Samsung, E: \ samsung.txt
Htc, E: \ htc.txt
Nokia, E \ nokia.txt
Blackberry, E: \ ежевика. 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)

Если файл не разделен запятой, он будет просто читать каждый линии и добавить его в выпадающем списке, так что она действует нормально (это будет иметь важное значение для последних файлов в дереве)

Далее вам нужны эти методы для ComboBoxes

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 возможно, в событии загрузки формы.

+0

Спасибо, я попробую это –