2

TextBox1で特定の文字列を検索するために、検索バーを作成しようとしていますListBox1

検索した文字列を持たない他のアイテムを削除したい。たとえば、リストに (チーズ、卵、牛乳、チキン、チョコレート) が含まれている場合、「ch」を検索すると、チーズ、チキン、チョコレートのみが表示されます。これは可能ですか?

ここにあるこのコードは、文字を検索しますが、他のものを排除しません。

編集: -これらはすべて非常に優れた応答ですが、リストボックスに特定のディレクトリのファイル名が入力されているため、このエラーが発生するため、それらのいずれも使用できません。

DataSource プロパティが設定されている場合、Items コレクションは変更できません。

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    Dim i As Integer = ListBox1.FindString(TextBox1.Text)
    ListBox1.SelectedIndex = i
    If TextBox1.Text = "" Then
        ListBox1.SelectedIndex = -1
    End If
End Sub

助けていただければ幸いです。ありがとう。

4

3 に答える 3

4

そのように機能させるには、すべてのアイテムのメモリ内のリストが必要になりListBox1、一致するものだけが表示されます。そうしないと、ユーザーが検索フレーズを短くするためにバックスペースを押したときに、元のアイテムがまったく返されませんでした。したがって、TextBox1_TextChangedイベントでこれを行う最も簡単な方法は、 をクリアしてからListBox1、メモリ内のすべてのアイテムをループしてから、 に一致するアイテムを追加することListBox1です。例えば:

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    ListBox1.Items.Clear()
    For Each item As String In allItems
        If item.StartsWith(TextBox1.Text, StringComparison.CurrentCultureIgnoreCase) Then
            ListBox1.Items.Add(item)
        End If
    Next
End Sub

この例allItemsは、すべてのアイテムのメモリ内リストです。アイテムが文字列のように見える場合は、それを にList(Of String)して、クラス/フォーム レベルでプライベート フィールドとして宣言することをお勧めします。

private allItems As New List(Of String)()

次に、おそらくフォームのLoadイベントで、リストをどこかに入力する必要があります。

allItems.Add("cheese")
allItems.Add("eggs")
allItems.Add("milk")
allItems.Add("chicken")
allItems.Add("chocolate")

ただし、必要なのはオートコンプリート テキスト ボックスだけである場合、車輪を再発明するのはばかげています。WinFormコントロールは、そのプロパティ TextBoxでこの機能を本質的にサポートします。AutoComplete

于 2012-07-10T17:54:12.827 に答える
1
    Dim lstBindTheseStrings As List(Of Object) = (From objString As Object _
                                                  In ListBox1.Items _
                                                  Where CStr(objString).StartsWith(TextBox1.Text)).ToList()

    ListBox1.DataSource = lstBindTheseStrings

    ListBox1.SelectedIndex = If((ListBox1.FindString(TextBox1.Text) > -1), _
                                 ListBox1.FindString(TextBox1.Text), -1)

編集:

上記のコードは、リストボックスで最初に何をフィルタリングします。SteveDogのソリューションは、探しているものの多くですが、LinqステートメントのListBox1.ItemsをAllItemsリストに置き換えて、目的の場所に到達することができます。

于 2012-07-10T17:54:46.920 に答える
0

SteveDog のソリューションは、検索のたびにリストボックスを再作成し続ける必要がないため、希望どおりの方法です。ただし、そのパスに設定されている場合...

    Dim i As Integer
    For i = 0 To ListBox1.Items.Count - 1
        If i > ListBox1.Items.Count - 1 Then Exit For
        If Not ListBox1.Items(i).Contains(Textbox1.Text) Then
            ListBox1.Items.Remove(ListBox1.Items(i))
            i -= 1
        End If
    Next

面倒に見えますが、そうではありませんか?

于 2012-07-10T18:02:19.883 に答える