【问题标题】:DataView - Reverse RowFilter conditionDataView - 反转 RowFilter 条件
【发布时间】:2015-09-28 16:36:13
【问题描述】:

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

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

RowFilter = NOT (original condition)

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

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

【问题讨论】:

  • 你能不能不做 myDataView.RowFilter = "[NAME OF Column1]0"
  • 将“=”替换为“”会导致与使用 NOT 相同的问题。我不得不说“StatusID 10 OR StatusID IS NULL”,而不是“StatusID = 10”。这就是我想避免的(我必须承认,希望渺茫)。
  • 请检查答案是否符合您的要求。

标签: sql asp.net gridview


【解决方案1】:

如果我正确理解了您的问题,您希望获得未过滤的其余结果集。 我知道没有你在伪代码中显示的直接 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();

这是另一个表格,可以为您提供相反的结果。

【讨论】:

  • 感谢您的想法。最后,我可能会使用它(获取未过滤数据和过滤数据之间的差异)。我没有想过这样做的方式。
  • 没有你想的那样。你必须从逻辑上解决它。我已经展示了我已经使用和工作的一种方法。
  • NOT 存在但不给出直接条件的“余数”。我想这就是你的意思。
猜你喜欢
  • 2011-09-20
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多