.NET BindingSource.Filter с регулярными выражениями - PullRequest
5 голосов
/ 04 мая 2009

Я использую BindingSource.Filter для перечисления только определенных элементов источника данных. особенно я использую это так много:

m_bindingSourceTAnimation.Filter = "Name LIKE '" + FilterText + "'";

Теперь мой вопрос: возможно ли использовать регулярные выражения с этими фильтрами?

Мне бы особенно понадобилось несколько подстановочных знаков (*), таких как

*hello*world*

спасибо!

Ответы [ 5 ]

10 голосов
/ 11 мая 2009

Вы можете довольно легко запросить DataTable с помощью LINQ, а затем вы можете использовать фактическое регулярное выражение в запросе, чтобы фильтровать его так, как вам нравится.

Как то так ...

var source = myDataTable.AsEnumerable();

var results = from matchingItem in source
              where Regex.IsMatch(matchingItem.Field<string>("Name"), "<put Regex here>")
              select matchingItem;

//If you need them as a list when you are done (to bind to or something)
var list = results.ToList();

Это даст вам строки, которые соответствуют на основе фактического регулярного выражения, я не знаю, что вам нужно делать с информацией, но это позволит вам получить строки на основе регулярного выражения.

**** Обновление ** - Попытка уточнить на основе комментария

Я не знаю, для чего вы это используете, поэтому у меня нет хорошего контекста, но из того, что я могу догадаться, вы используете DataTable для привязки данных к Grid или что-то в этом роде. Если это так, я думаю, что вы должны иметь возможность назначить «список» из фрагмента, который я вставил здесь, как DataSource (при условии, что вы используете BindingSource), и я думаю, что он будет работать. Я не использую DataTables, я обычно придерживаюсь объектов для работы с моими данными, поэтому я не совсем уверен, как он будет обрабатывать список строк, но я думаю, что он будет работать (или будет достаточно близко, чтобы немного поискать в Google сделает это).

5 голосов
/ 04 мая 2009

BindingSource полагается на IBindingListView.Filter для этой функции. Поведение зависит полностью от конкретной реализации списка. Это DataTable / DataView? Если это так, это соответствует DataView.RowFilter, с синтаксисом в списке здесь .

Реализация DataView не поддерживает регулярные выражения, но поддерживает LIKE через * - т.е. где FilterText - это что-то вроде "Foo*Bar*". По крайней мере, это мое понимание.


Я все еще предполагаю, что вы используете DataTable / DataView ... прагматичной альтернативой может быть введение дополнительного (bool) столбца для этой цели. Установите / очистите этот маркер в качестве предиката (используя регулярное выражение или любую другую сложную логику) и просто используйте фильтр строк, чтобы сказать «где установлено». Может быть, не очень чисто, но намного проще, чем реализация пользовательского представления данных / источника привязки.


Если вы используете объекты (а не DataTable), то другим вариантом может быть Dynamic LINQ Library . Я не знаю весь спектр того, что он поддерживает, но он (Where(string)), безусловно, имеет некоторые / большую часть возможностей RowFilter. И поскольку код доступен в примере проекта, возможно , вы можете научить его применять регулярные выражения?

1 голос
/ 17 ноября 2011

Я решил эту проблему, разделив строку поиска по шаблону, а затем создал выражение фильтра строк, используя значения разделения.

Array a = SearchString.Split('*');
string rowFilter = "";

if (a.GetUpperBound(0) == 1)
{

  rowFilter = "(MODEL_NBR like '" + a.GetValue(0).ToString() + "*' AND MODEL_NBR like '*"      + a.GetValue(1).ToString() + "')";

 }

Если вы используете несколько подстановочных знаков, вы можете создать рекурсивную функцию, которая создает фильтр выражения

1 голос
/ 22 мая 2009

Комментарий ниже не работает:

"... прагматичной альтернативой может быть введение для этой цели дополнительного (bool) столбца. Установите / очистите этот маркер в качестве предиката (используя регулярное выражение или любую другую сложную логику) и просто используйте Фильтр строк, чтобы сказать «где установлено». Может быть, не очень чисто, но намного проще, чем реализация пользовательского представления данных / источника привязки. "

Когда вы устанавливаете новый столбец, это приводит к изменению состояния строки, и вы в итоге получаете всю таблицу / представление данных, думая, что она должна выполнить каждую строку в следующем обновлении. Не уверен, как обойти эту проблему.

0 голосов
/ 22 марта 2017
    '[Description] Is column name
    Dim SearchStrArr() As String = Split(txtSearch.Text, " ")
    Dim FilterString As String = "" 
    FilterString = String.Join("%' AND [Description] Like '%", SearchStrArr)
    FilterString = "[Description] Like '%" & FilterString & "%'"

    m_bindingSourceTAnimation.Filter = FilterString 
...