Сбой BindingSource.Filter (внедрение)

Итак, у меня есть простой код:

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

Source является объектом BindingSource.

txtSearch является текстовым полем.

Каков правильный метод, чтобы убедиться, что он всегда будет рассматривать содержимое txtSearch.Text как строку, а не падать каждый раз, когда я набираю "(" или ряд других символов (пока не знаю, какие).

Наверняка где-то должна быть функция, чтобы избежать всего этого или что-то в этом роде?


person Matty    schedule 11.06.2013    source источник


Ответы (3)


Просто столкнулся с той же проблемой и нашел это решение на 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();
}
person jtmnt    schedule 14.10.2014

Встроенной функции нет. Но все же вы можете написать свой собственный метод расширения следующим образом:

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() + "%'";

Примечание.

Вы можете переименовать метод на подходящий. Я использовал это имя только для вашего понимания.

person Bhushan Firake    schedule 11.06.2013
comment
-1 На самом деле нет. Таким образом, вы просто удаляете все символы, отличные от ASCII (не очень подходящее решение для клиентов за пределами США). Существуют различные правила для экранирования этой строки. . - person Adriano Repetti; 11.06.2013
comment
@Adriano Это всего лишь пример метода. Я попросил OP написать свой собственный, подобный этому. Предполагается, что он будет пропускать персонажей в соответствии со своей культурой и регионом. - person Bhushan Firake; 11.06.2013
comment
Я не могу согласиться, он должен написать свой собственный метод, но способ сделать это не отбрасывать неизвестные символы. Он должен экранировать символы, которые, как он знает, имеют особое значение, все остальное нужно оставить нетронутым. - person Adriano Repetti; 11.06.2013
comment
Да, извините за скорость ответа, мне нужны персонажи, я не могу их просто выбросить. Я обнаружил, что эта проблема существует, когда искал действительный результат, содержащий эти символы. Если результаты не отображаются, поиск бессмысленен. - person Matty; 20.06.2013
comment
@Matty Вы не будете использовать больше символов, чем эти, не так ли? - person Bhushan Firake; 20.06.2013
comment
@Bhushan Firake Я буду использовать () [] и, возможно, любые другие символы, которые другая организация, предоставляющая данные, может подумать об использовании в будущем. Если бы у меня был список всех символов, которые нужно экранировать, и каков подходящий способ экранирования, я мог бы написать что-нибудь, но я также не могу найти эту информацию. - person Matty; 20.06.2013

Почему бы не включить строку поиска в качестве параметра исходного запроса? Единственный раз, когда я использовал BindingSource.Filter, — это когда я хочу отфильтровать данные, которые, как я знаю, существуют, т. е. заполнить CheckedListBox всеми возможными значениями в определенном столбце и разрешить пользователю выбирать, какие из них просматривать.

Альтернативой может быть перехват исключения из специальных символов и обработка его сообщением пользователю.

person ashishduh    schedule 11.06.2013
comment
Я бы хотел, но исходного запроса нет, это просто файл XML. Список довольно большой. Часть проблемы заключается в том, что мне нужно разрешить скобки, поэтому я не могу просто игнорировать это. - person Matty; 11.06.2013