2016-01-13 95 views
1

我正在創建一個程序,用戶可以將搜索輸入到文本框中,然後使用一系列組合框縮小搜索結果的範圍(或者僅使用組合框搜索通過一切)。vb.net根據前兩個組合框中的選定項目更改組合框選項

程序是這樣的:

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 

但是,代碼將無法正常工作改變是什麼:form 1

我曾嘗試使用下面的代碼所做的第二個組合框的變化選項第三個盒子。我已經重複下面的代碼爲每個選項:

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

我先清除了內容,否則如果您在第一個組合框中單擊了錯誤的東西,它只會添加更多選項而不是完全更改它們 –

+0

我把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
平板電腦,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:\黑莓。 txt

等等每個項目鏈接到另一個文件。對於樹中的最後一個文件 - 我認爲這些文件包含每個品牌手機的型號列表,只需將它們作爲簡單列表即可。每個模型後都沒有逗號或任何內容。

使用此代碼做每一個組合框的填充

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)

如果該文件不是逗號分隔的,它將只讀取每個所以,它的正常動作(這將是在樹中的最後一個文件很重要)

接下來,你需要這些方法的組合框

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

謝謝,我會試試這個 –

相關問題