Benutzer mit den meisten Antworten
ungebundenes DataGridView filtern

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 { } }
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
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.
- Bearbeitet Tom Lambert (Koopakiller)Moderator Dienstag, 6. August 2013 19:24 Codekorrektur
-
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:
- Hello
- Hello World
- 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.
- Bearbeitet Tom Lambert (Koopakiller)Moderator Dienstag, 6. August 2013 15:03 PS
-
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 { } }
-
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. -
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; } } }
-
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