2016-03-19 4 views
1

Ich möchte eine Suchfunktion auf meinem DataGridView, hinter einem Button Click Event erstellen. Um dies zu tun, habe ich den folgenden Quellcode:Case-insensitive Suchfunktion in C#

chargerDataGrid(); 
dg_logiciel.ClearSelection(); 

string search = txtbox_recherche.Text; 
foreach (DataGridViewRow dgvr in dg_logiciel.Rows) 
{ 
    if (!dgvr.Cells[1].Value.ToString().Contains(search)) 
    { 
     dgvr.Visible = false; 
    } 
} 

Es funktioniert, aber ich möchte meinen zwei Strings ignoriert Fall vergleichen. Um das zu tun, habe ich diesen Code versucht:

chargerDataGrid(); 
dg_logiciel.ClearSelection(); 

string search = txtbox_recherche.Text; 
foreach (DataGridViewRow row in dg_logiciel.Rows) 
{ 
    Regex pattern = new Regex(row.Cells[1].Value.ToString(), RegexOptions.IgnoreCase); 
    if (!pattern.IsMatch(search)) 
    { 
     row.Visible = false; 
    } 
} 

Welche überhaupt nicht funktioniert. Benutze ich schlecht die Regex Klasse oder etwas?

Antwort

2

Leider fehlt .NET eine string.Contains(string, StringComparison) Funktionsüberlastung.

Aber man kann so eine Erweiterungsfunktion zu einem Projekt leicht hinzufügen, wie wir eine passende IndexOf Überlastung haben:

public static class StringExtensions 
{ 
    public static bool Contains(this string str, string value, StringComparison comparison) 
    { 
     return str.IndexOf(value, comparison) >= 0; 
    } 
} 

Dann nutzen Sie einfach:

if (!dgvr.Cells[1].Value.ToString().Contains(search, StringComparison.OrdinalIgnoreCase)) 

oder CurrentCultureIgnoreCase verwenden, abhängig von Ihren Bedürfnissen .


Was Ihre regex Versuch, dann ist es einfach nicht notwendig, dass solche Längen zu gehen, aber Ihr Versuch schlägt fehl, da eine Kombination aus den folgenden Gründen:

  • Sie den Wert, den Sie suchen invertiert und die Zeichenfolge, in der Sie suchen. Sie müssten Ihre Regex-Instanz mit der Zeichenfolge search als Muster erstellen.
  • Apropos, Sie sollten dem Suchwert entkommen sein. Wenn es Regex-Metazeichen enthält, ist das Muster ungültig. Sie hätten Regex.Escape für diesen Zweck verwenden können.

Also, die folgenden hätte gearbeitet, aber ist nicht der richtige Weg, um den Job zu tun:

if (!Regex.IsMatch(row.Cells[1].Value.ToString(), Regex.Escape(search), RegexOptions.IgnoreCase)) 
+1

Danke für die Hilfe und die Erklärung wird! Es funktioniert perfekt. –

0

in Ihrer Antwort, was die Bedeutung der folgenden Parameter ist und wie es funktioniert?

this string str 

Ich meine, wie this und statische koexistieren

+1

Lesen Sie nur über Erweiterungsmethoden. Und dieser Beitrag sollte ein Kommentar sein, um zu antworten. Löschen Sie dies so schnell wie möglich. – shameleo

+0

https://msdn.microsoft.com/en-us/library/bb383977.aspx –