Entwickler-Ecke
WinForms - [3.5] Voll text suche in Listbox.
implicit - Di 20.04.10 16:41
Titel: [3.5] Voll text suche in Listbox.
Hi,
Ich habe mal wieder nen kleines problem. Ich versuche eine Volltext Suche in einer Listbox zu arrangieren.
Ich habe zwar code snipes gefunden, welche ein Item in der ListBox finden, aber leider nur den ersten Wert sucht und selektiert.
Wenn ich zum Beispiel statt dem ersten string einen beliebigen eingebe findet er diesen nicht.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| private void hotsearch_Click(object sender, EventArgs e) { string searchString = hotsearchtextbox.Text; { hottopicListbox.SelectionMode = SelectionMode.MultiExtended; int x = -1; if (searchString.Length != 0) { do { x = hottopicListbox.FindString(searchString, x); if (x != -1) { if (hottopicListbox.SelectedIndices.Count > 0) { if (x == hottopicListbox.SelectedIndices[0]) return; } hottopicListbox.SetSelected(x, true); } } while (x != -1); } } } |
Die Items in der listbox sehen folgendermassen aus:
Prio:3 Bla bla bla blub
Prio:2 muhkuh mama
Prio:3 rambazamba
Prio:1 uh wow text
Der code funktioniert nur wenn ich in dem searchfeld Prio:3 oder Prio:1 eingebe ..
Wenn ich zumbeispiel "uh" eingebe findet er nichts..
danke fuer irgend eine hilfe im vorraus.
Gruss Steffen
Moderiert von
Kha: Quote- durch C#-Tags ersetzt
Kha - Di 20.04.10 17:16
implicit hat folgendes geschrieben : |
Ich habe zwar code snipes gefunden, welche ein Item in der ListBox finden, aber leider nur den ersten Wert sucht und selektiert.
Wenn ich zum Beispiel statt dem ersten string einen beliebigen eingebe findet er diesen nicht. |
implicit hat folgendes geschrieben : |
Der code funktioniert nur wenn ich in dem searchfeld Prio:3 oder Prio:1 eingebe ..
Wenn ich zumbeispiel "uh" eingebe findet er nichts.. |
Wo ist denn zwischen den zwei Aussagen der Zusammenhang :gruebel: ?
Wenn
FindString nicht passt, musst du eben ohne die Methode auskommen. Eine
for-Schleife über alle Listbox-Einträge, darin
string.Contains und schon ist der Code sogar übersichtlicher als zuvor.
implicit - Di 20.04.10 17:37
Hi Kha,
schoen das Du Antwortest. Ja der Zusammenhang ist das tatsaechlich ein FindString auf der Listbox nicht die gewuenschte loesung bietet.
Zitat: |
Wenn FindString nicht passt, musst du eben ohne die Methode auskommen. Eine for-Schleife über alle Listbox-Einträge, darin string.Contains und schon ist der Code sogar übersichtlicher als zuvor. |
Wie meinst Du das mit ner for schleife und string.contains ?
Dann muesste ich die Listbox wieder auslesen und in nen Array packen ? und das Array durchsuchen .. dannach den indexwert vom array nehmen und in der listbox selectieren ?
bissel verwirrt bin .. sorry
Waere Dir sehr verbunden wenn Du mir ein kleines Beispiel fuer diese for Schleife geben kannst.
Gruss Steffen
implicit - Di 20.04.10 19:01
Hi,
Ok also die for schleife habe ich hinbekommen.. jetzt sucht er tatsaechlich wie in einer voll text suche ..
die methode FindString kann mal also voll in die *** stellen.
Jetzt muss ich nur noch die zeilen selektieren wo der string gefunden wird.
Ich Probiere natuerlich weiter aber wenn Du Kha nochmal nen kleinen Ideenschub geben kannst wuerde ich es sehr begruessen.
Gruss Steffen
Kha - Di 20.04.10 19:57
Wenn du über die Schleife einen Index hast, bei dem ein Treffer gelandet wurde, dann bist du doch mit SetSelected schon am Ziel...?
implicit - Di 20.04.10 20:08
hi,
naja so einfach ist das net :) weil ich ja nach nem string suche und bei der foreach schleife die Items durchsuche.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| string s = hotsearchtextbox.Text; if (s.Length != 0) { foreach (string str in hottopicListbox.Items) { if (str.Contains(s)) { MessageBox.Show(str); int i = hottopicListbox.Items.IndexOf(str); hottopicListbox.SetSelected(i, true); } } |
So sieht derzeit die schleife aus. Bringt mir aber nen komischen bound error. Weisst Du was da falsch ist ?
Gruss Steffen
implicit - Di 20.04.10 20:52
ok keine for schleife :) eine foreach habe ich mal genutzt.
Nichtsdestotrotz sollte dein
foreach-Code eigentlich funktionieren. Da müsstest du dir mal
i im Debugger genauer anschauen.[/quote]
Also debugger von i sagt :
Zitat: |
List that this enumerator is bound to has been modified. An enumerator can only be used if the list does not change.
|
Er meckert irgendwie die selektion des Items an ?
Oder wie muss ich das verstehen ?
Kha - Di 20.04.10 22:08
Du bist lustig, bei "bound" habe ich an "Out of Bounds" gedacht ;) .
Bei dem Fehler kannst du leider nicht viel mehr machen als auf foreach zu verzichten. Du darfst mir ruhig glauben, dass es mit for sowieso einfacher wird, IndexOf brauchst du dann nicht mehr.
implicit - Di 20.04.10 22:08
Hi ok erledigt :)
Es bedarf zwei foreach schleifen.
Die erste ist fuer das auslesen des strings direkt aus den items. Die legt gleichzeitig die Index nummer in ein Array.
Die zweite um dann die selektion der Items in der Listbox vorzunehmen. Dies geschieht durch auslesen des Arrays durch die 2te foreach schleife.
Schwere geburt ;) aber finally strike.
Hier mal nen bissel code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| private void hotsearch_Click(object sender, EventArgs e) { try { string s = hotsearchtextbox.Text; hottopicListbox.SelectionMode = SelectionMode.MultiExtended; if (s.Length != 0) { List<int> selections = new List<int>(); foreach (string str in hottopicListbox.Items) { if (str.Contains(s)) { MessageBox.Show(str); selections.Add(hottopicListbox.Items.IndexOf(str)); } } foreach (int index in selections) { hottopicListbox.SetSelected(index, true); } } } catch (Exception upsala) { MessageBox.Show(upsala.Message); } } |
Jetzt funktioniert es genau so wie ich es haben will. Man kann volltext in der listbox suchen und nicht nur das erste element.
Danke fuer die Hilfe Kha.
Gruss Steffen
P.S.
Zitat: |
Du bist lustig, bei "bound" habe ich an "Out of Bounds" gedacht ;) .
Bei dem Fehler kannst du leider nicht viel mehr machen als auf foreach zu verzichten. Du darfst mir ruhig glauben, dass es mit for sowieso einfacher wird, IndexOf brauchst du dann nicht mehr.
|
Erzaehl mal wie die for schleife ausgesehen haette bitte. Moechte ja schliesslich auch bissel dazulernen. :)
Kha - Di 20.04.10 22:19
implicit hat folgendes geschrieben : |
Die zweite um dann die selektion der Items in der Listbox vorzunehmen. Dies geschieht durch auslesen des Arrays durch die 2te foreach schleife. |
Hehe, genau das war auch mein Gedanke, hätte ich die foreach-Schleife retten wollen :) .
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| string search = hotsearchtextbox.Text; if (search == "") return;
for (int i = 0; i < hottopicListbox.Items.Count; i++) { var item = (string)hottopicListbox.Items[i]; if (item.Contains(search)) hottopicListbox.SetSelected(i, true); } |
implicit - Di 20.04.10 22:41
Huhu,
Ok mit for sieht es einfacher aus ... ABER,,, :)
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| hottopicListbox.SelectionMode = SelectionMode.MultiExtended; string search = hotsearchtextbox.Text; if (search == "") return;
for (int i = 0; i < hottopicListbox.Items.Count; i++) { var item = (string)hottopicListbox.Items[i]; if (item.Contains(search)) MessageBox.Show(item); hottopicListbox.SetSelected(i, true); } |
Wenn ich das so schreibe bzw. copy paste udn bissel veraender, so das er das ergebnis auch als messagebox anzeigt, dann markiert er alle items in der listbox.
Sehr komisch ..
Brauch man hier auch zwei for schleifen ?
Kha - Di 20.04.10 23:22
implicit hat folgendes geschrieben : |
Brauch man hier auch zwei for schleifen ? |
Nein, die richtige geschweifte Klammerung um das
if ;) .
Es hat schon seine Gründe, dass manche auf die Klammern bestehen, selbst wenn es nur um ein einzelnes Statement geht, aber ich bin einfach viel zu faul dafür :mrgreen: .
implicit - Di 20.04.10 23:43
OH mein Gott,
Da haetteich aber auch selber drauf kommen koennen.. Klar fehlen da die Klammern um if ..
ROFl
ok so jetzt laeuft auch alles mit deiner for schleife..
Gruss Steffen.
Danke Dir nochmal vielmals fuer die Ideen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!