Frage zur Listbox (sortierung)
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.
-
-
Du kannst ja mal
versuchen. -
-
-
-
haiyyu schrieb:
Gute Fehlerbeschreibung.
Da hast du recht
Also bei mir funktioniert es: Listbox fokussieren (drauf klicken :D) und taste drücken. -
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
- Private Sub FocusItem(ByVal input As String)
- For i As Integer = 0 To ListBox1.Items.Count - 1 'Alle Items durchgehen
- 'Unter der Bedingung, dass der Text des Items mit input beginnt
- If ListBox1.GetItemText(ListBox1.Items(i)).StartsWith(input, StringComparison.CurrentCultureIgnoreCase) Then
- ListBox1.SelectedIndex = i 'Index auf das aktuelle Item setzen, falls die Bedingung zutrifft
- Exit For 'Keine weiteren Items mehr beachten
- End If
- Next
- 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
- Private Sub FocusNextItem(ByVal input As String)
- Dim ind As Integer 'Index, an dem die Suche startet
- If ListBox1.SelectedIndex <> -1 Then 'Ist ein Item ausgewaehlt
- 'und beginnt das Item mit dem in input angegebenen Text
- If ListBox1.GetItemText(ListBox1.SelectedItem).StartsWith(input, StringComparison.CurrentCultureIgnoreCase) Then
- ind = ListBox1.SelectedIndex + 1 'wird nach dem aktuell ausgewaehlten Item mit der Suche begonnen
- Else
- ind = 0 'sonst wird bei 0 begonnen
- End If
- Else
- ind = 0 'sonst wird bei 0 begonnen
- End If
- For i As Integer = ind To ListBox1.Items.Count - 1 'alle Items nach ind durchgehen
- 'Item, das mit input beginnt auswaehlen
- If ListBox1.GetItemText(ListBox1.Items(i)).StartsWith(input, StringComparison.CurrentCultureIgnoreCase) Then
- ListBox1.SelectedIndex = i 'gewaehltes Item setzen
- Exit For 'Schleife verlassen, funktioniert auch mit Exit Sub (ist halt performanter, fuehrt aber ggf. gewuenschten Code darunter nicht aus)
- End If
- Next
- If ListBox1.SelectedIndex < ind Then 'Ist kein Item nach dem Item mit Index ind gefunden worden, das mit input beginnt
- For i As Integer = 0 To ind - 1 'werden alle Items vor dem aktuell ausgewaehlten Item durchsucht (oder keines, falls ind = 0)
- If ListBox1.GetItemText(ListBox1.Items(i)).StartsWith(input, StringComparison.CurrentCultureIgnoreCase) Then
- ListBox1.SelectedIndex = i 'und selbiges
- Exit For
- End If
- Next
- End If
- 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 -
-
~blaze~ schrieb:
Muss das so sein?
Ja das muss so sein
Habe deinen ersten Code benutzt und funktioniert super.
Jetz ist aber leider das ausgewählte Item am unteren Ende der Liste.
Kann man das auch an die erste Stelle "packen"?It's not a bug, it's a feature -
So besser?
-
luckyracer8 schrieb:
So besser?
Ja sehr schön.
Vielen Dank
Wenn es jetzt noch ne möglichkeit gibt das ausgewählte Item an oberste stelle zu stellen wäre das super.It's not a bug, it's a feature -
-
-
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.
-
Ähnliche Themen
-
underground77 - - Sonstige Problemstellungen
-
5 Benutzer haben hier geschrieben
- mys3lf (7)
- ~blaze~ (3)
- Gast (3)
- haiyyu (1)
- ErfinderDesRades (1)