none
ungebundenes DataGridView filtern RRS feed

  • Frage

  • Hallo,

    Ich würde gerne ein ungebundenes DataGridView nach einem String durchsuchen, und markieren lassen. 

    Das klappt auch schon ganz gut, nur möchte ich jetzt nach Teilstring´s Suchen und mir diese Anzeigen lassen, was nicht funktioniert. Wie geht ich da am besten vor?

    private void suchen()
            {
    
                string searchValue = suchwort;
    
                tbl_etb.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                try
                {
                    foreach (DataGridViewRow row in tbl_etb.Rows)
                    {
                        if (row.Cells[4].Value.ToString().Equals(searchValue))
                        {
                            row.Selected = true;
                           
                        }
                    }
                }
                catch 
                {
                    
                }
            }

    Montag, 5. August 2013 19:30

Antworten

  • Also Compilerfehler gibts schonmal keine (bei mir) Bei der Ausführung aber kann noch etwas schief gehen. Dazu gleich mehr

    Zuerst aber, die foreach-Schleifen solltest du genau anders herum verschachteln. Alle Wörter in einer Zeile suchen und nicht jedes Wort in jeder Zeile. So verschwendest du eventuell Arbeitsleistung.

    Ich habe den Code nochmal komplett zusammen gefasst und kommentiert:

                string searchValue = "Hello World";//Suchbegriff
    
                string[] searchWords = searchValue.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);//Suchbegriff in einzelne Wörter aufteilen
                foreach (DataGridViewRow row in dataGridView1.Rows)//Alle Zeilen durchgehen
                {
                    bool b = false;//Auf true setzen, wenn Zeile ein Suchwort enthält
                    foreach (string word in searchWords)//Alle Wörter durchgehen
                    {
                        if (row.Cells[3].Value != null)//Überprüfen ob Zelle einen Wert enthält
                        {
                            if (row.Cells[3].Value.ToString().Contains(word))//Jedes Wort einzeln prüfen ob es in der Zeile(Zelle) steht
                            {
                                b = true;//Wort ist enthalten
                                break; //Weitere Wörter brauchen nicht mehr durchsucht werden > Abbruch der inneren Schleife
                            }
                        }
                    }
                    if (b)//Überprüfen ob min. ein Wort gefunden wurde
                    {
                        row.Selected = true;//Ja > Zeile markieren.
                    }
                }
    Den Code habe ich dieses mal auch getestet, Fehler sollten nun also nicht mehr drinn sein. Ich hoffe das es nun auch bei dir funktioniert.



    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Chilltok Mittwoch, 7. August 2013 18:05
    Dienstag, 6. August 2013 20:26
    Moderator

Alle Antworten

  • Hallo, wenn du mithilfe von ToString() und Equals arbeitest, dann wird immer der ganze String verglichen.

    Für dein Vorhaben kannst du beispielsweise die Contains-Methode verwenden. also so hier:

              if (row.Cells[4].Value.ToString().Contains(searchValue))
                        {
                            row.Selected = true;
                           
                        }

    Wenn du nach mehreren Wörtern zu gleich suchen willst, dann musst du searchValue aufsplitten und jedes einzeln abfragen.

    bool b = false;
    foreach(string word in searchValue.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries))
    {
        if(row.Cells[4].Value.ToString().Contains(word))
    {
    b = true;
    break; // 1 Wort stimmt überein, andere können ignoriert werden.
    } }
    if(b)
    row.Selected = true;


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.



    Montag, 5. August 2013 19:39
    Moderator
  • Guten Abend,

    dein Code sieht sehr gut aus, nur leider sagt er mir bei der Foreachschleife das eine 

    Konvertierung vom Typ "char" in "string"  nicht möglich ist.
    Montag, 5. August 2013 19:55
  • Du kannst auch den 1. Codeschnippsel nehmen, im 2. war noch ein kleiner Fehler. Du musst natürlich erst den Suchtext aufsplitten:

    foreach(string word in searchValue.Split(' ', StringSplitOptions.RemoveEmptyEntries))

    Split spaltet das Suchwort am Leerzeichen auf. der 2. Parameter gibt an, das leere Elemente entfernt werden. Sonst würden alle markiert werden, wenn der Text ein doppeltes Leerzeichen, ein Leerzeichen am Anfang/Ende hat oder searchValue "" ist.

    Zur Erklärung was beim 2. Code anders funktioniert, als beim ersten. Du hast 3 Datensätze:

    1. Hello
    2. Hello World
    3. World

    Wenn du nun anch "Hello" suchst, bekommst du im ersten Code 1. und 2. geliefert. Wenn du nach "World Hello" suchst, bekommst du beim 1. garkeinen Datensatz und beim 2. alle. Das liegt daran, das jedes Wort einzeln überprüft wird (Split + foreach).

    PS: Ich habe den Code auch oben geändert.


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.


    Dienstag, 6. August 2013 14:59
    Moderator
  • Leider klappt es bei mir immer noch nicht . Ich bekomme folgenden Fehler:

    Fehler 1 Die beste Übereinstimmung für die überladene string.Split(params char[])-Methode hat einige ungültige Argumente.
    Fehler 2 2-Argument: Kann nicht von "System.StringSplitOptions" in "char" konvertiert werden.

    private void suchen()
            {
    
                string searchValue = suchwort;
                bool b = false;
    
               
                tbl_etb.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                try
                {
                    
                    foreach (string word in searchValue.Split(' ', StringSplitOptions.RemoveEmptyEntries))
                    {
                        if (row.Cells[4].Value.ToString().Contains(word))
                        {
                            b = true;
                            break; // 1 Wort stimmt überein, andere können ignoriert werden.
                        }
                        if (b)
                        {
                            row.Selected = true;
                        }
                    }
                    
                }
                catch 
                {
                    
                }
            }

    Dienstag, 6. August 2013 19:02
  • Man, was ist nur mit mir los :(

    Das char muss in ein Array:

    foreach (string word in searchValue.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries))

    PS: Hab die Codes oben nochmal korrigiert...


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Dienstag, 6. August 2013 19:24
    Moderator
  • Leider markiert er bei mir nun das Ganze GridView
     string searchValue = suchwort;
                bool b = false;
                foreach (string word in searchValue.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries))
                {
                    foreach (DataGridViewRow row in tbl_etb.Rows)
                    {
                        if (row.Cells[4].Value.ToString().Contains(word))
                        {
                            b = true;
                            //break; 
                        }
                        if (b)
                        {
                            row.Selected = true;
                        }
                    }
                    
                }

    Dienstag, 6. August 2013 19:53
  • Also Compilerfehler gibts schonmal keine (bei mir) Bei der Ausführung aber kann noch etwas schief gehen. Dazu gleich mehr

    Zuerst aber, die foreach-Schleifen solltest du genau anders herum verschachteln. Alle Wörter in einer Zeile suchen und nicht jedes Wort in jeder Zeile. So verschwendest du eventuell Arbeitsleistung.

    Ich habe den Code nochmal komplett zusammen gefasst und kommentiert:

                string searchValue = "Hello World";//Suchbegriff
    
                string[] searchWords = searchValue.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);//Suchbegriff in einzelne Wörter aufteilen
                foreach (DataGridViewRow row in dataGridView1.Rows)//Alle Zeilen durchgehen
                {
                    bool b = false;//Auf true setzen, wenn Zeile ein Suchwort enthält
                    foreach (string word in searchWords)//Alle Wörter durchgehen
                    {
                        if (row.Cells[3].Value != null)//Überprüfen ob Zelle einen Wert enthält
                        {
                            if (row.Cells[3].Value.ToString().Contains(word))//Jedes Wort einzeln prüfen ob es in der Zeile(Zelle) steht
                            {
                                b = true;//Wort ist enthalten
                                break; //Weitere Wörter brauchen nicht mehr durchsucht werden > Abbruch der inneren Schleife
                            }
                        }
                    }
                    if (b)//Überprüfen ob min. ein Wort gefunden wurde
                    {
                        row.Selected = true;//Ja > Zeile markieren.
                    }
                }
    Den Code habe ich dieses mal auch getestet, Fehler sollten nun also nicht mehr drinn sein. Ich hoffe das es nun auch bei dir funktioniert.



    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    • Als Antwort markiert Chilltok Mittwoch, 7. August 2013 18:05
    Dienstag, 6. August 2013 20:26
    Moderator
  • Super jetzt klappts! Vielen Dank!
    Dienstag, 6. August 2013 20:32
  • Hi Chilltok,

    Wurde deine Frage hilfreich beantwortet ?

    Wenn ja, bitte markiere die jeweilige Antwort .

    Gruss,

    Ciprian

    Mittwoch, 7. August 2013 12:49