DataView - 反向RowFilter条件

时间:2015-09-28 16:36:14

标签: sql asp.net gridview

我有一个带有RowFilter实现的可自定义过滤器的GridView。对于每列,用户可以指定过滤标准。一旦设置了所有期望的标准,他就点击"应用过滤器"。将所有列的条件组合在一起以创建DataView的RowFilter表达式。

现在,我想实现一个"反向"选项(复选框),它将简单地反转DataView的RowFilter条件。我的第一个想法是简单地说:

RowFilter = NOT (original condition)

就是这样。显然不是,因为具有NULL值的字段。例如,如果过滤器具有条件StatusID = 10,并且如果某些记录具有StatusID的NULL值,则条件NOT (StatusID = 10)将不包括那些记录(根据我的测试)。对于一个字段,我可以轻松地进行更改以考虑NULL,但是,当在条件中组合多个字段时,它会变得更复杂。

我的问题:当涉及具有NULL值的字段时,是否有一种聪明的方法来全局反转RowFilter条件,或者我是否必须为每个单独的字段测试NULL?

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,您希望获得未过滤的结果集的其余部分。 我知道你的伪代码中没有直接的NOT函数。 您可以做的是首先根据过滤器获取数据视图,这可能是您已经存在的,如下所示:

DataView dv= //Whatever filter you use

然后使用DataView.ToTable()

将其转换为数据表

接下来,您可以轻松找到这两个数据表之间的区别,如

var rowsOnlyInDt1 = dt1.AsEnumerable().Where(r => !dt2.AsEnumerable()
                .Any(r2 => r["col1"].Trim().ToLower() == r2["col1"].Trim().ToLower() && r["col2"].Trim().ToLower() == r2["col2"].Trim().ToLower()));

DataTable result = rowsOnlyInDt1.CopyToDataTable();

这是另一张表,并为您提供反向结果。