我有一个带有RowFilter实现的可自定义过滤器的GridView。对于每列,用户可以指定过滤标准。一旦设置了所有期望的标准,他就点击"应用过滤器"。将所有列的条件组合在一起以创建DataView的RowFilter表达式。
现在,我想实现一个"反向"选项(复选框),它将简单地反转DataView的RowFilter条件。我的第一个想法是简单地说:
RowFilter = NOT (original condition)
就是这样。显然不是,因为具有NULL值的字段。例如,如果过滤器具有条件StatusID = 10
,并且如果某些记录具有StatusID的NULL值,则条件NOT (StatusID = 10)
将不包括那些记录(根据我的测试)。对于一个字段,我可以轻松地进行更改以考虑NULL,但是,当在条件中组合多个字段时,它会变得更复杂。
我的问题:当涉及具有NULL值的字段时,是否有一种聪明的方法来全局反转RowFilter条件,或者我是否必须为每个单独的字段测试NULL?
答案 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();
这是另一张表,并为您提供反向结果。