Autor Beitrag
implicit
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: 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.

ausblenden 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; // Set the SelectionMode property of the ListBox to select multiple items.
                int x = -1// Set our intial index variable to -1.                    
                if (searchString.Length != 0// If the search string is empty exit.
                {   // Loop through and find each item that matches the search string.
                    do
                    {   // Retrieve the item based on the previous index found. Starts with -1 which searches start.
                        x = hottopicListbox.FindString(searchString, x);
                        // If no item is found that matches exit.
                        if (x != -1)
                        {
                            // Since the FindString loops infinitely, determine if we found first item again and exit.
                            if (hottopicListbox.SelectedIndices.Count > 0)
                            {
                                if (x == hottopicListbox.SelectedIndices[0])
                                    return;
                            }
                            hottopicListbox.SetSelected(x, true); // Select the item in the ListBox once it is found.
                        }
                    } 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 user profile iconKha: Quote- durch C#-Tags ersetzt
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 20.04.10 17:16 
user profile iconimplicit hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconimplicit hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: 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.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
               
string s = hotsearchtextbox.Text;
      if (s.Length != 0// If the search string is empty exit.
                {
                    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 20.04.10 20:30 
user profile iconimplicit hat folgendes geschrieben Zum zitierten Posting springen:
weil ich ja nach nem string suche und bei der foreach schleife die Items durchsuche.
Hm.
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
for-Schleife
user profile iconimplicit hat folgendes geschrieben Zum zitierten Posting springen:
for Schleife
user profile iconimplicit hat folgendes geschrieben Zum zitierten Posting springen:
Ok also die for schleife habe ich hinbekommen..


Nichtsdestotrotz sollte dein foreach-Code eigentlich funktionieren. Da müsstest du dir mal i im Debugger genauer anschauen.

_________________
>λ=
implicit Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: 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:

ausblenden 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; // multimode selection
                //int i = -1;
                if (s.Length != 0// wenn net dann net.
                {
                    List<int> selections = new List<int>(); // array fuer die index eintraege
                    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 20.04.10 22:19 
user profile iconimplicit hat folgendes geschrieben Zum zitierten Posting springen:
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 :) .

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Di 20.04.10 22:41 
Huhu,

Ok mit for sieht es einfacher aus ... ABER,,, :)

ausblenden 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); // MessageBox mit Ergebniszeigen
                        hottopicListbox.SetSelected(i, true); //Ergebniss in der Listbox markieren
                }


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 20.04.10 23:22 
user profile iconimplicit hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: 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.