Listbox echtzeit Suchfunktion (per Textbox)

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von ratio44.

    Listbox echtzeit Suchfunktion (per Textbox)

    hallo zusammen
    ich versuche, eine suchfunktion für die listbox items einzurichten, aber kriege es einfach nicht hin....
    ziel wäre es, dass ich in der textbox einen buchstaben schreibe, dann alle die items übrigbleiben, die mit dem buchstaben beginnen, dann den 2. buchstaben und so weiter, ein echtzeitupdate halt der listbox...
    nehme mal an, dass man in dem verfahren alle items, die nict entsprechen, entfernt werden müssen, folglich müsste man sie auch wieder hinzufügen können, wenn ich einen buchstaben lösche...
    Naja du musst halt mit einer For-Next Schleife die Items durchgehen und in dieser Schleife prüfst du einfach, ob das Item den Text der Textbox enthält, wenn nicht löschst du das Item raus, wenn schon lässt du es drinne und fügst z.B. ein Schlüssel- "wort" dazu. Realisieren könntest du es z.B. mit Contains(). Und es gibt ein tolles TextBox Event, nennt sich, TextChanged, dadrinnen kannste das ganze ablaufen lassen ;) Ich guck mal ob ich selber so etwas realisieren kann.

    Ist also nur eine Vermutung, das es so funktionieren könnte. 8o
    naja ich habs im textchanged probiert mit


    For i As Integer = ListBox.Items.Count - 1 To 0 Step -1
    If Not ListBox.Items(i).ToString.Contains(TextBox.Text) Then
    ListBox.Items.RemoveAt(i)
    End If
    Next



    aber das resultat ist, dass er den jeweils getippten buchstaben durforstet der verbleibenden items
    Es gibt noch eine elegante Methode für Textboxen zur Autovervollständigung. Du kannst nämlich eine Liste übergeben (Textbox.Autocompletesource). Der Rest geht weitgehend automatischisch.
    Hier mit Beispühl

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Was hat denn das ganze mit Autocomplete zu tun?
    Es kann zwar möglich sein, das es so verwendet werden soll (sehr unsauber!), kann
    aber genausogut dafür gedacht sein einfach eine lange Liste zu durchsuchen?

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Huhu,

    mein Tip:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _listItem As New List(Of String)
    3. Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
    4. Dim result As New List(Of String)
    5. result.AddRange(From i As String In _listItem Select i Where i.StartsWith(Me.TextBox1.Text))
    6. If result.Count > 0 Then
    7. Me.ListBox1.Items.Clear()
    8. Me.ListBox1.Items.AddRange(result.ToArray())
    9. End If
    10. End Sub
    11. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    12. _listItem.AddRange(From i As Object In Me.ListBox1.Items Select CStr(i.ToString()))
    13. End Sub
    14. End Class


    EDIT: Natürlich daran denken, wenn Du zur Laufzeit ein Item der ListBox hinzufügst, bzw. entfernst, die Liste entsprechend zu synchronisieren.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Büdde:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class ListBoxSearch
    3. Private itms As New List(Of String)
    4. Private Sub txtSearch_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSearch.TextChanged
    5. For Each item As String In itms
    6. If Not lstBox.Items.Contains(item) Then
    7. lstBox.Items.Add(item)
    8. End If
    9. Next
    10. For Each s As String In itms
    11. If Not s.StartsWith(txtSearch.Text) Then
    12. lstBox.Items.Remove(s)
    13. End If
    14. Next
    15. End Sub
    16. Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
    17. lstBox.Items.Add(txtAdd.Text)
    18. itms.Add(txtAdd.Text)
    19. txtAdd.Text = Nothing
    20. End Sub
    21. End Class


    Form enthält:
    2 TextBoxen = txtSearch und txtAdd
    1 Button = btnAdd
    1 ListBox = lstBox

    Namen erklären sich selbst.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Ein einfaches Beispiel mit DataBinding. Ausführlichere Beispiele siehe die Tutorials von @ErfinderDesRades (Stichwort: Typisiertes DataSet)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class MainForm
    2. Private _bindingsource As New BindingSource
    3. Private _datatable As New DataTable
    4. Private Const COLNAME As String = "Content"
    5. Private Sub MainForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    6. ' Spalte(n) erstellen
    7. With _datatable.Columns
    8. .Clear()
    9. .Add(COLNAME, GetType(String))
    10. End With
    11. ' Datenquelle für BindingSource setzen
    12. _bindingsource.DataSource = _datatable
    13. ' BindingSource an ListBox anhängen
    14. With Me.TestListBox
    15. .DataSource = _bindingsource
    16. .DisplayMember = COLNAME ' -> Spaltenname
    17. End With
    18. ' Testdaten
    19. Dim personNames = {"Maier", "Meyer", "Müller", "Schmidt", "Schmitt"}
    20. For Each personName In personNames
    21. Me.AddContent(personName)
    22. Next
    23. End Sub
    24. ' Filtern
    25. Private Sub FilterTextBox_TextChanged(sender As System.Object, e As System.EventArgs) Handles FilterTextBox.TextChanged
    26. _bindingsource.Filter = String.Format("[{0}] LIKE '{1}%'", COLNAME, DirectCast(sender, TextBox).Text)
    27. End Sub
    28. ' Holfsfunktion -> Datensatz hinzufügen
    29. Private Sub AddContent(content As String)
    30. Dim row = _datatable.NewRow
    31. row(0) = content
    32. _datatable.Rows.Add(row)
    33. End Sub
    34. End Class