BindingSource.过滤器崩溃(注入)
本文关键字:注入 崩溃 过滤器 BindingSource | 更新日期: 2023-09-27 18:17:50
所以我有一些简单的代码:
source.Filter = "n LIKE '%" + txtSearch.Text + "%'";
Source
为BindingSource对象。
txtSearch
是一个TextBox
什么是正确的方法,以确保它将始终考虑txtSearch.Text
的内容作为一个字符串,而不是崩溃每次我输入一个"("或其他一些字符(不确定)。
肯定有一个函数在某处逃避所有这些,或者什么?
刚刚遇到同样的问题,从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();
}
没有内置函数。但是,您仍然可以像这样编写自己的扩展方法:
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。过滤器是当我想过滤的数据,我知道存在,即填充一个CheckedListBox与所有可能的值在一个特定的列,并允许用户选择哪些要查看。
另一种方法是捕获特殊字符的异常,并通过向用户发送消息来处理它。