私の目標は、複数のテキストボックスを使用して検索を開発することです。5つの列(ArticleNo、Description、PartNum、Manufacturer、Cost)があり、それぞれにテキストボックスがあります。
私は以下を使用して元のリストアイテムを追跡します:
Private originalListItems As New List(Of ListViewItem)
これはすべてのアイテム(6000以上)で満たされています。
次に、作成された5つのテキストボックス(tbSearchArticleNo、tbSearchDescription、tbSearchPartNum ...など)に基づいて、5つの「テキスト変更」イベントが発生します。
Private Sub tbSearchArticleNo_TextChanged(sender As Object, e As System.EventArgs) Handles tbSearchArticleNo.TextChanged
If tbSearchDesc.Text <> "" Or tbPartNum.Text <> "" Or tbManufacturer.Text <> "" Or tbCost.Text <> "" Then
SearchCurrentList(lwArticles, tbSearchArticleNo.Text, 0, False)
Else
SearchListView(lwArticles, tbSearchArticleNo.Text, 0, False)
End If
End Sub
これが私のメソッドSearchCurrentListです:
Private Sub SearchCurrentList(ByVal listview As ListView, ByVal search As String, ByVal colIndex As Integer, ByVal upperCase As Boolean)
If upperCase Then
search = search.ToUpper()
End If
listview.BeginUpdate()
'Clear listview
lwArticles.Items.Clear()
'Other textbox has information in it, concatenate both results
For Each item In currentListItems
Dim itemToUpper = item.SubItems.Item(colIndex).Text
If upperCase Then
itemToUpper = item.SubItems.Item(colIndex).Text.ToUpper()
End If
If itemToUpper.Contains(search) Then
lwArticles.Items.Add(item)
End If
Next
'Reupdate the current list of items
currentListItems.Clear()
For Each item In lwArticles.Items
currentListItems.Add(item)
Next
listview.EndUpdate()
End Sub
そして、これが私のメソッドSearchListViewです。
Private Sub SearchListView(ByVal listview As ListView, ByVal search As String, ByVal colIndex As Integer, ByVal upperCase As Boolean)
'Upper case parameter determines if you're searching a string, if so, it is better to compare everything by uppercase
If upperCase Then
search = search.ToUpper()
End If
listview.BeginUpdate()
If search.Trim().Length = 0 Then
'Clear listview
listview.Items.Clear()
'Clear currentListItems
currentListItems.Clear()
'If nothing is in the textbox make all items appear
For Each item In originalListItems
listview.Items.Add(item)
Next
Else
'Clear listview
listview.Items.Clear()
'Clear currentListItems
currentListItems.Clear()
'Go through each item in the original list and only add the ones which contain the search text
For Each item In originalListItems
Dim currItem = item.SubItems.Item(colIndex).Text
If upperCase Then
currItem = currItem.ToUpper()
End If
If currItem.Contains(search) Then
currentListItems.Add(item)
listview.Items.Add(item)
End If
Next
End If
listview.EndUpdate()
End Sub
これが私の検索の例です:
tbSearchArticleNo.Text = "33"
これは、文字列に「33」を含むすべてのarticleNoに一致します。次に、別のフィルターを追加します。
tbSearchDescription.Text="ミキサー"
これは、記事番号に33が含まれ、説明に「ミキサー」が含まれるすべてのものと一致する必要があります。などなど4番目。
実際のフィルターは正しく機能しています-私の唯一の問題は、「ミキサー」などの何かを消去するたびに(articleNoに「33」が残っている間)、「33」を含むarticleNoの結果が返されないことです...代わりに検索結果は変わりません。これを検索するより良い方法があるかもしれませんか?