5

我正在使用 BindingSource.Filter 仅列出数据源的某些元素。特别是我经常这样使用它:

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

现在我的问题是,是否可以通过这些过滤器使用正则表达式。

我尤其需要多个通配符 (*) 字符,例如

*hello*world*

谢谢!

4

5 回答 5

10

您可以很容易地使用 LINQ 查询 DataTable,然后您可以在查询中使用实际的 Regex 来随意过滤它。

像这样的东西...

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 或类似的东西。如果是这种情况,我认为您应该能够从我放在这里的代码段中分配“列表”作为数据源(假设您使用的是 BindingSource)并且我认为它会起作用。我不使用 DataTables,我通常坚持使用对象来处理我的数据,所以我不确定它将如何处理行列表,但我认为它会起作用(或者足够接近谷歌搜索会这样做)。

于 2009-05-11T02:17:17.433 回答
5

BindingSource依赖于IBindingListView.Filter这个功能。该行为完全取决于特定的列表实现。这是DataTable/DataView吗?如果是这样,这将映射到DataView.RowFilter,语法在此处列出。

DataView实现没有正则表达式支持,但支持LIKEvia *- 即 where FilterTextis like "Foo*Bar*". 至少,这是我的理解。


我仍然假设您正在使用DataTable/ DataView... 一个务实的替代方案可能是为此目的引入一个额外的(布尔)列。将该标记设置/清除为谓词(使用正则表达式或任何其他复杂的逻辑),然后使用行过滤器说出“设置位置”。也许不是很干净,但比实现自定义数据视图/绑定源要简单得多。


如果您正在使用对象(而不是DataTable),那么另一个选项可能是Dynamic LINQ Library。我不知道它支持的全部范围,但它(Where(string))肯定有一些/大部分的RowFilter能力。并且由于示例项目中提供了代码,您可以教育它应用正则表达式吗?

于 2009-05-04T10:07:03.780 回答
1

我通过用通配符拆分搜索字符串解决了这个问题,然后使用拆分值创建了行过滤器表达式。

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

 }

如果您使用多个通配符,您可以创建一个递归函数来创建过滤器表达式

于 2011-11-17T15:55:13.817 回答
1

The comment below doesn't really work:

"...a pragmatic alternative might be to introduce an extra (bool) column for the purpose. Set/clear that marker as the predicate (using a regex or any other complicated logic), and just use the row-filter to say "where set". Not very clean, maybe, but a lot simpler than implementing a custom data-view / binding-source."

When you set the new column this causes the row state to change and you basically end up with the whole table/dataview thinking that it needs to do every row in the next update. Not sure how to get around this problem.

于 2009-05-21T21:19:26.127 回答
0
    '[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 
于 2017-03-22T06:59:11.453 回答