所以,我有一些簡單的代碼:BindingSource.Filter崩潰(注射)
source.Filter = "n LIKE '%" + txtSearch.Text + "%'";
Source
是一個BindingSource的對象。
txtSearch
是一個TextBox。
是什麼,以確保它總是會考慮txtSearch.Text
的內容作爲一個字符串,而不是崩潰每次我鍵入「(」或一些其他字符(不知道這還)時間的正確方法。
當然必須有一個功能某處逃避這一切,什麼
所以,我有一些簡單的代碼:BindingSource.Filter崩潰(注射)
source.Filter = "n LIKE '%" + txtSearch.Text + "%'";
Source
是一個BindingSource的對象。
txtSearch
是一個TextBox。
是什麼,以確保它總是會考慮txtSearch.Text
的內容作爲一個字符串,而不是崩潰每次我鍵入「(」或一些其他字符(不知道這還)時間的正確方法。
當然必須有一個功能某處逃避這一切,什麼
有沒有內置功能但是,你仍然可以編寫自己的擴展方法是這樣的:。
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() + "%'";
注:
您可以將方法重命名爲合適的一個。我只是用這個名字來理解你的目的。
爲什麼不在原始查詢中包含搜索字符串作爲參數?我唯一一次使用BindingSource.Filter的時候,是想根據我知道存在的數據進行過濾,即在特定的列上填充CheckedListBox並使用所有可能的值,並允許用戶選擇要查看的數據。
另一種方法是從特殊字符中捕捉異常,並用消息處理它給用戶。
我會,但沒有原始查詢,它只是一個XML文件。這個清單非常大。部分問題是我需要使用括號,因此我不能忽略它。 – Matty
恰好碰到了同樣的問題,並發現該解決方案從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();
}
它的作品像魅力。 –
-1真的沒有。通過這種方式,您只需**刪除**每個非ASCII字符(對非美國客戶來說不是非常合適的解決方案)。有[不同的規則](http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx)轉義該字符串。 –
@Adriano這只是一個示例方法。我曾要求OP自己寫這樣的一本。據推測,他會根據自己的文化和地區跳過本科 –
我不同意,他必須寫自己的方法,但是做的方式是**不行丟棄_unknown_字符**。他應該逃避他知道的具有特殊含義的角色,其他一切都必須保持不變。 –