Frage zur Listbox (sortierung)

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Frage zur Listbox (sortierung)

    Hallo alle zusammen,
    es gibt ja die möglichkeit wenn eine Listbox den Focus hat und man dann einen Buchstaben drückt, dass die Listbox zum
    ersten Item mit dem gedrückten Anfangsbuchstaben springt.
    Geht das auch per Code?
    It's not a bug, it's a feature
    Du kannst ja mal

    VB.NET-Quellcode

    1. Private Sub ListBox1_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles ListBox1.KeyDown
    2. For Each item In ListBox1.Items
    3. If item.ToString.StartsWith(e.KeyCode.ToString) Then
    4. ListBox1.SelectedItem = item
    5. Exit For
    6. End If
    7. Next
    8. End Sub

    versuchen.
    Hi
    das ist nicht besonders schwer.
    Der Code hier geht einfach alle Items durch und sucht nach dem ersten Ergebnis, das mit der Zeichenfolge input beginnt. Dabei wird auch die Groß-und Kleinschreibung unter Beachtung der momentanen Kultur ignoriert.

    VB.NET-Quellcode

    1. Private Sub FocusItem(ByVal input As String)
    2. For i As Integer = 0 To ListBox1.Items.Count - 1 'Alle Items durchgehen
    3. 'Unter der Bedingung, dass der Text des Items mit input beginnt
    4. If ListBox1.GetItemText(ListBox1.Items(i)).StartsWith(input, StringComparison.CurrentCultureIgnoreCase) Then
    5. ListBox1.SelectedIndex = i 'Index auf das aktuelle Item setzen, falls die Bedingung zutrifft
    6. Exit For 'Keine weiteren Items mehr beachten
    7. End If
    8. Next
    9. End Sub

    Oder hier mal eine etwas andere Variante. Wenn bereits ein Item ausgewählt ist und dieses mit dem in input spezifizierten Text beginnt, wird ab dem aktuell ausgewählten Item weitergesucht. Falls das nicht der Fall ist, wird bei 0 begonnen. Falls doch, wird, wenn kein Item nach dem gewählten mit dem Text beginnt, wieder von 0 aus gesucht. Einfach mal ausprobieren.

    VB.NET-Quellcode

    1. Private Sub FocusNextItem(ByVal input As String)
    2. Dim ind As Integer 'Index, an dem die Suche startet
    3. If ListBox1.SelectedIndex <> -1 Then 'Ist ein Item ausgewaehlt
    4. 'und beginnt das Item mit dem in input angegebenen Text
    5. If ListBox1.GetItemText(ListBox1.SelectedItem).StartsWith(input, StringComparison.CurrentCultureIgnoreCase) Then
    6. ind = ListBox1.SelectedIndex + 1 'wird nach dem aktuell ausgewaehlten Item mit der Suche begonnen
    7. Else
    8. ind = 0 'sonst wird bei 0 begonnen
    9. End If
    10. Else
    11. ind = 0 'sonst wird bei 0 begonnen
    12. End If
    13. For i As Integer = ind To ListBox1.Items.Count - 1 'alle Items nach ind durchgehen
    14. 'Item, das mit input beginnt auswaehlen
    15. If ListBox1.GetItemText(ListBox1.Items(i)).StartsWith(input, StringComparison.CurrentCultureIgnoreCase) Then
    16. ListBox1.SelectedIndex = i 'gewaehltes Item setzen
    17. Exit For 'Schleife verlassen, funktioniert auch mit Exit Sub (ist halt performanter, fuehrt aber ggf. gewuenschten Code darunter nicht aus)
    18. End If
    19. Next
    20. If ListBox1.SelectedIndex < ind Then 'Ist kein Item nach dem Item mit Index ind gefunden worden, das mit input beginnt
    21. For i As Integer = 0 To ind - 1 'werden alle Items vor dem aktuell ausgewaehlten Item durchsucht (oder keines, falls ind = 0)
    22. If ListBox1.GetItemText(ListBox1.Items(i)).StartsWith(input, StringComparison.CurrentCultureIgnoreCase) Then
    23. ListBox1.SelectedIndex = i 'und selbiges
    24. Exit For
    25. End If
    26. Next
    27. End If
    28. End Sub


    Zur Information noch: Wenn die Liste sortiert ist, ist der Algorithmus nicht optimiert. Das stand jetzt nicht explizit in der Frage drin, daher habe ich das mal nicht berücksichtigt. Wenn es nur ein Char sein soll, geht das natürlich noch viel schneller, indem du einfach die Länge des Item-Texts untersuchst und den 1. Char überprüfst.

    Gruß
    ~blaze~
    OK ich glaube ich habe mich bei meinem ersten post nicht gut genug ausgedrückt.
    In einer Listbox sind 200 Items drin.
    In der zweiten Listbox stehen die Buchstaben A-Z drin.
    Ich möchte nun wenn ich in der zweiten listbox z.b. M drücke das dann in der ersten Listbox
    das erste Item mit einem M ausgewählt wird.
    It's not a bug, it's a feature
    So besser?

    VB.NET-Quellcode

    1. Private Sub ListBox2_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListBox2.SelectedIndexChanged
    2. For Each item In ListBox1.Items
    3. If item.ToString.StartsWith(ListBox2.SelectedItem.ToString) Then
    4. ListBox1.SelectedItem = item
    5. Exit For
    6. End If
    7. Next
    8. End Sub

    mys3lf schrieb:

    Wenn es jetzt noch ne möglichkeit gibt das ausgewählte Item an oberste stelle zu stellen wäre das super.

    ich hatte ähnliches Prob mit Treeview, und die Lösung bestand darin, erstmal ans Ende der Treeview zu hopsen, und dann das ziel-item zu selecten - also ziemlich krampfig.

    ich empfehle DatagridView. Da kann man eine .TopLeftCell-Property festlegen.