带有正则表达式的.NET BindingSource.Filter

时间:2009-05-04 10:00:54

标签: c# .net regex bindingsource

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

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

现在我的问题是,如果以某种方式可以使用带有这些过滤器的正则表达式。

我特别需要多个通配符(*),如

*hello*world*

谢谢!

5 个答案:

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

这将根据实际的Regex获取匹配的行,我不知道您需要对信息做什么,但这将允许您根据正则表达式获取行。

****更新** - 试图根据评论澄清

我不知道你使用的是什么,所以我没有很好的上下文,但我可以猜到你正在使用DataTable将数据绑定到Grid或类似的东西。如果是这种情况,我认为您应该能够从我在这里作为DataSource放置的片段中指定“list”(假设您使用的是BindingSource),我认为它会起作用。我不使用DataTables,我通常会坚持使用对象处理我的数据,所以我不确定它将如何处理行列表,但我认为它会起作用(或者足够接近一点google搜索会这样做。)

答案 1 :(得分:5)

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

DataView实施没有正则表达式支持,但通过LIKE支持* - 即FilterText类似于"Foo*Bar*"。至少,这是我的理解。


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


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

答案 2 :(得分:1)

以下评论并不真正有效:

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

当你设置新列时,这会导致行状态发生变化,你基本上会得到整个表/数据视图,认为它需要在下一次更新中执行每一行。 不知道如何解决这个问题。

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

 }

如果使用多个通配符,则可以创建一个递归函数来创建过滤器expressio

答案 4 :(得分: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