2016-07-22 60 views
0

我有一個文本框用於通過數據表中的關鍵字進行研究。當表格顯示所有搜索到的單詞都以黃色突出顯示時。問題是,如果我搜索"hello"和它在數據庫中寫入"Hello""HELLO"這個詞將不會突出顯示,我用toLower()但它沒有改變任何東西,有人可以給我的想法嗎?對文本框不起作用的大小寫不敏感

string word = tbSearch.Text.ToLower().Replace("'", " "); 

e.Row.Cells[2].Text = ((DataRowView)e.Row.DataItem).Row[2] 
    .ToString() 
    .ToLower() 
    .Replace(tbSearch.Text, "<b class='highlighted'>" + tbSearch.Text + "</b>"); 

我試過代碼它的工作原理,如果我做的研究中微不足道,但如果在研究我寫"HELLO"將無法​​正常工作。我想要的是識別關鍵字並突出顯示它,而不管大小寫。

+9

您可能想嘗試使用您準備的'word'替換第二行中的'tbSearch.Text'。現在的方式是,如果'tbSearch.Text'還沒有小寫,它就不能工作。 –

+0

將信息添加到@ManfredRadlwimmer將包含'tbSearch.Text'的第二行更改爲'word' – Thennarasan

+0

我合理地確信這種情況在數據庫查詢中不是問題。如果我查詢我的數據庫'namE'或'nAme',我仍然得到相同的結果 – Takarii

回答

1

當前的方法改變了輸入字符串的外殼。我推薦了不同的方法:

public static string Highlight(string text, string highlight, string prepend, string append) 
{ 
    StringBuilder result = new StringBuilder(); 
    int position = 0; 
    int previousPosition = 0; 

    while (position >= 0) 
    { 
     position = text.IndexOf(highlight, position, 
      StringComparison.InvariantCultureIgnoreCase); 

     if (position >= 0) 
     { 
      result.Append(text.Substring(previousPosition, position - previousPosition)); 
      result.Append(prepend); 
      result.Append(text.Substring(position, highlight.Length)); 
      result.Append(prepend); 

      previousPosition = position + highlight.Length; 
      position++; 
     } 
     else 
     { 
      result.Append(text.Substring(previousPosition)); 
     } 
    } 
    return result.ToString(); 
} 

使用這種方法的

string x = "This test Test TEST should be highTESTjk lighted TeS"; 
string y = Highlight(x, "test", "<b>", "</b>"); 

結果會變成

這個測試測試測試應highTESTjk點燃TES

分成

測試測試TEST應該是高TEST JK點燃TES

,而不是

測試測試測試應該是高test jk lighted tes

2

問題是string.Replace區分大小寫。所以你需要一種替代方式,不關心案件。不幸的是,沒有辦法使string.Replace區分大小寫。幸運的是,我們的正則表達式:

var text = "This is my hello"; 
var searchText = "MY"; 

var result = 
    Regex.Replace 
    (
    text, 
    Regex.Escape(searchText), 
    i => string.Format("<b class=\"highlighted\">{0}</b>", i.Value), 
    RegexOptions.IgnoreCase 
); 

Console.WriteLine(result); // This is <b class="highlighted">my</b> hello 

因爲你很可能會反覆使用相同的模式很多時候,你可能要保持正則表達式的緩存編譯實例,但是這取決於你。