BindingSource.Filter崩溃(注入)

时间:2013-06-11 15:32:28

标签: c# bindingsource

所以我有一些简单的代码:

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

Source是BindingSource对象。

txtSearch是一个TextBox。

确保它始终将txtSearch.Text的内容视为字符串的正确方法是什么,并且每次键入“(”或其他一些字符时都不会崩溃(不确定哪个字符)

当然必须有一个功能可以逃避所有这些或其他什么?

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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() + "%'";

注意:

您可以将方法重命名为合适的方法。我仅将此名称用于您的理解目的。

答案 2 :(得分:0)

为什么不在原始查询中包含搜索字符串作为参数?我使用BindingSource.Filter的唯一一次是当我想要根据我知道存在的数据进行过滤时,即在特定列上填充具有所有可能值的CheckedListBox并允许用户选择要查看的数据。

另一种方法是从特殊字符中捕获异常并通过向用户发送消息来处理它。

相关问题