Sql DataView-反向行筛选器条件

Sql DataView-反向行筛选器条件,sql,asp.net,gridview,Sql,Asp.net,Gridview,我有一个GridView,它有一个可定制的过滤器,用RowFilter实现。对于每一列,用户可以指定一个筛选标准。设置完所有需要的条件后,他单击“应用过滤器”。所有列的条件组合在一起,以创建DataView的RowFilter表达式 现在,我想实现一个“Reverse”选项(一个复选框),它将简单地反转DataView的RowFilter条件。我的第一个想法是简单地说: RowFilter = NOT (original condition) 就这样。显然不是,因为字段值为空。例如,如果筛选器

我有一个GridView,它有一个可定制的过滤器,用RowFilter实现。对于每一列,用户可以指定一个筛选标准。设置完所有需要的条件后,他单击“应用过滤器”。所有列的条件组合在一起,以创建DataView的RowFilter表达式

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

RowFilter = NOT (original condition)
就这样。显然不是,因为字段值为空。例如,如果筛选器具有条件
StatusID=10
,并且如果某些记录的StatusID值为空,则条件
NOT(StatusID=10)
将不包括这些记录(根据我的测试)。对于一个字段,我可以很容易地将其更改为account For NULL,但是,当在条件中组合多个字段时,它会变得更加复杂


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

如果我正确理解了您的问题,您希望得到未过滤的结果集的其余部分。 我知道没有像您在伪代码中所显示的那样的直接NOT函数。 您可以首先获取基于过滤器的dataview,这可能是您已经准备好的,如下所示:

DataView dv= //Whatever filter you use
然后使用
DataView.ToTable()

接下来,您可以很容易地找到这两个数据表之间的区别,如


这是另一个表,会给您相反的结果。

您不能执行myDataView.RowFilter=“[NAME OF Column1]0”替换“=”会导致与使用not相同的问题。我必须说“StatusID 10或StatusID为空”,而不是“StatusID=10”。这就是我想要避免的(我必须承认,希望渺茫)。请检查答案是否符合您的要求。谢谢您的想法。最后,我可以使用它(获得未过滤数据和过滤数据之间的差异)。我没有想过这样做。没有你想的那样。你必须合乎逻辑地解决它。我已经展示了一种方法,我已经使用和工作了。这个方法不存在,但没有给出直线条件的“剩余部分”。我想这就是你的意思。
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();