Autor |
Beitrag |
implicit
      
Beiträge: 36
|
Verfasst: Di 20.04.10 16:41
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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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  ?
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 
      
Beiträge: 36
|
Verfasst: 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 
      
Beiträge: 36
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 36
|
Verfasst: 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
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 20.04.10 20:30
|
|
implicit 
      
Beiträge: 36
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 36
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 20.04.10 22:19
|
|
implicit 
      
Beiträge: 36
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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  .
_________________ >λ=
|
|
implicit 
      
Beiträge: 36
|
Verfasst: 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.
|
|