2014-10-02 3 views
0

Существует множество вопросов по этому вопросу, но никто не решает мою проблему. У меня база данных SQL-сервера как источник данных, текстовое поле ввода и кнопка поиска. Когда текст введен и кнопка поиска нажата, отображается выпадающий список строк, содержащих искомый текст. Пользователь выбирает строку, на которую они хотят посмотреть, и эта информация отображается в виде сетки. (1 строка вернулась)C# .Regex.replace ignore case не работает

Я хочу, чтобы искомый текст был выделен. Это то, что у меня есть, и она должна работать, но я не могу понять, почему он не делает:

foreach (GridViewRow row in searchTextGridView2.Rows) 
     { 
      string text = searchText_txt.Text; //Text that was entered in the search text field 
      int length = searchTextGridView2.Columns.Count; //Number of Columns on the grid 
      for (int i = 0; i < length; i++) //loop through each column 
      { 
       string newText = row.Cells[i].Text.ToString(); //Get the text in the cell 
       if (newText.Contains(text)) //If the cell text contains the search text then do this 
       { 
        string highlight = "<span style='background-color:yellow'>" + text + "</span>"; 
        string replacedText = Regex.Replace(newText, text, highlight, RegexOptions.IgnoreCase); 
        row.Cells[i].Text = replacedText; 
       } 
      } 
     } 

Вышеприведенный код находится внутри события для выпадающего списка выбранный элемент изменен. Если я искал «претензии», он выделит все экземпляры этого слова, но если бы я искал «Претензии», он выделяет только слова со значением «C». Любая помощь оценивается

+0

I 'd хотел бы отметить, что даже после исправления проблемы с '' Содержаниями', код будет по-прежнему (1) заменять экземпляры 'x' на' X', если вы ищете 'X', и (2) замените все с '.', если вы ch для '.'. – Rawling

+0

Да, просто наткнулся на это сейчас. Я думаю, что мне нужно будет получить длину элемента поиска, найти индекс в ячейке, а затем использовать эти переменные, чтобы скопировать текст, который был найден в ячейке, в новую переменную, чтобы поддерживать этот случай. –

+1

Для (1), если вы переключаете '' "+ text +" "' to '" $ 0 "', '' $ 0' говорит регулярному выражению использовать текст, который он сопоставил при замене. Для (2) вы можете использовать 'Regex.Escape1 на входе. – Rawling

ответ

4

Ваша проблема не в методе Replace() - это метод Contains().

Всякий раз, когда вы звоните Contains() на строку он будет выполнять case-sensitive сравнение, так что следующая строка всегда будет возвращать false:

"Some Claims".Contains("claims"); 

Чтобы преодолеть это, вы должны использовать String.IndexOf(String, Int32) метод:

for (int i = 0; i < length; i++) 
{ 
    string newText = row.Cells[i].Text.ToString(); 
    if (newText.IndexOf(text, StringComparison.CurrentCultureIgnoreCase) >= 0 
    { 
     string highlight = "<span style='background-color:yellow'>$0</span>"; 
     string replacedText = Regex.Replace(newText, text, highlight, RegexOptions.IgnoreCase); 
     row.Cells[i].Text = replacedText; 
    } 
} 
+1

Это звучит так, как будто он должен работать, но он не сделал :(Он указал мне в правильном направлении, хотя с .Contains. Я использовал 'int index = newText.IndexOf (текст, StringComparison.CurrentCultureIgnoreCase); вместо этого и это отлично работает .. ty –

+0

@KieranQuinn, мой плохой, я имел в виду указать на эту конкретную перегрузку, но полностью забыл. Я отредактировал ответ. – RePierre

+1

@ Rawling, вы уверены? MSDN не упоминает такую ​​перегрузку, Visual Studio intellisense. – RePierre