BindingSource.过滤器崩溃(注入)

本文关键字:注入 崩溃 过滤器 BindingSource | 更新日期: 2023-09-27 18:17:50

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

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

Source为BindingSource对象。

txtSearch是一个TextBox

什么是正确的方法,以确保它将始终考虑txtSearch.Text的内容作为一个字符串,而不是崩溃每次我输入一个"("或其他一些字符(不确定)。

肯定有一个函数在某处逃避所有这些,或者什么?

BindingSource.过滤器崩溃(注入)

刚刚遇到同样的问题,从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与所有可能的值在一个特定的列,并允许用户选择哪些要查看。

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