2013-06-11 70 views
0

所以,我有一些簡單的代碼:BindingSource.Filter崩潰(注射)

source.Filter = "n LIKE '%" + txtSearch.Text + "%'"; 

Source是一個BindingSource的對象。

txtSearch是一個TextBox。

是什麼,以確保它總是會考慮txtSearch.Text的內容作爲一個字符串,而不是崩潰每次我鍵入「(」或一些其他字符(不知道這還)時間的正確方法。

當然必須有一個功能某處逃避這一切,什麼

回答

0

沒有內置功能但是,你仍然可以編寫自己的擴展方法是這樣的:。

public static string RemoveSpecialCharacters(this string str) 
{ 
    StringBuilder stringBuilder = new StringBuilder(); 
    foreach (char c in str) 
    { 
     if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || 
      (c >= 'a' && c <= 'z') || c == '.' || c == '_') 
     { 
     stringBuilder.Append(c); 
     } 
    } 
    return stringBuilder.ToString(); 
} 

和你的代碼將成爲

source.Filter = "n LIKE '%" + txtSearch.Text.RemoveSpecialCharacters() + "%'"; 

注:

您可以將方法重命名爲合適的一個。我只是用這個名字來理解你的目的。

+0

-1真的沒有。通過這種方式,您只需**刪除**每個非ASCII字符(對非美國客戶來說不是非常合適的解決方案)。有[不同的規則](http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx)轉義該字符串。 –

+0

@Adriano這只是一個示例方法。我曾要求OP自己寫這樣的一本。據推測,他會根據自己的文化和地區跳過本科 –

+1

我不同意,他必須寫自己的方法,但是做的方式是**不行丟棄_unknown_字符**。他應該逃避他知道的具有特殊含義的角色,其他一切都必須保持不變。 –

0

爲什麼不在原始查詢中包含搜索字符串作爲參數?我唯一一次使用BindingSource.Filter的時候,是想根據我知道存在的數據進行過濾,即在特定的列上填充CheckedListBox並使用所有可能的值,並允許用戶選擇要查看的數據。

另一種方法是從特殊字符中捕捉異常,並用消息處理它給用戶。

+0

我會,但沒有原始查詢,它只是一個XML文件。這個清單非常大。部分問題是我需要使用括號,因此我不能忽略它。 – Matty

1

恰好碰到了同樣的問題,並發現該解決方案從http://www.csharp-examples.net/dataview-rowfilter/

public static string EscapeLikeValue(string valueWithoutWildcards) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < valueWithoutWildcards.Length; i++) 
    { 
    char c = valueWithoutWildcards[i]; 
    if (c == '*' || c == '%' || c == '[' || c == ']') 
     sb.Append("[").Append(c).Append("]"); 
    else if (c == '\'') 
     sb.Append("''"); 
    else 
    sb.Append(c); 
    } 
    return sb.ToString(); 
} 
+0

它的作品像魅力。 –