问题描述
我正在学习使用 bindingSource.Filter 并且在过去的几天里一直让我发疯。
我有 7 列,我正在尝试按照“如果该行已检查多个 ListCheckBox 中的值,则调整行以显示符合条件的行”的方式创建过滤器。基本上就像excel一样。
这是一个例子:
First Name
| Last Name
| EmployeeID
| Department
//
第一行示例 = John
| Doe
| 001
| IT
第二行示例 = Jane
| Doe
| 002
| HR
第三行示例 = Bob
| Doe
| 003
| Logistics
第四行示例 = Sally
| Doe
| 004
| Logistics
当然,这只是一个例子,但如何过滤超过 3 列? 我发现在 2 个相同的列或 2 个不同的列之间使用 OR 是有效的。
过滤一列:
例如:[First Name] = 'John' OR [First Name] = 'Jane'
过滤 2 列:
[First Name] = 'John' OR [First Name] = 'Jane' AND [Department] = 'IT'
用 3 列过滤:
[First Name] = 'John' AND [FirstName] = 'Jane' OR [Last Name] = 'Doe' AND [Department] = 'HR'
最后一个过滤器有效,但我不清楚何时使用 AND 以及何时使用 OR。
我认为在任何地方使用 AND 都可以解决问题,但事实并非如此。我的数据表最终只显示了 0 个结果。
我已经搜索了一篇文章或任何可以解释过滤逻辑的内容,但我找到的最接近的是 this article for Row Filter,这可能或多或少是同一件事?
感谢任何帮助或指导。
另外,如果有人知道除了使用 bindingsource.Filter 之外的更好的方法来对数据表进行多重过滤。不要害羞。
解决方法
我不清楚什么时候用AND,什么时候用OR
问题可能源于你的说话方式。我怀疑您可能会说“我想要所有蓝色汽车和所有红色卡车”-实际上是计算机术语。如果你说“对于列表中的每个项目,我只想看看它是蓝色汽车还是红色卡车”,那就更清楚了,只是人类倾向于不那样说话 - 他们说“和”当他们的意思是“或”:
(type = 'car' AND color = 'blue) OR (type = 'truck' AND color = 'red')
- AND 必须在一行中
- OR 必须在不同的行以及在一行内
Name = 'John' AND Name = 'Mary'
这个没意义。没有人的名字同时是约翰和玛丽。他们的名字叫约翰,或者他们的名字叫玛丽
记住 AND 在一行内起作用
John Smith
Mary Jones
firstname = 'john' AND lastname = 'jones;'
没有单行与此匹配 - 并且在该行内工作。没有行的名字是 john,姓氏是 jones
firstname = 'john' OR lastname = 'jones'
两行都返回 - 第一行,因为名字是 john。第二行,因为姓氏是琼斯。 OR 可以跨行工作,也可以在行内工作。或者可以应付你重复同样的事情:
firstname = 'john' OR firstname = 'mary'
所有这些事情都变成了一个真实的陈述,每行评估一次。对于约翰史密斯行:
firstname = 'john' --> it's true
OR
firstname = 'mary' --> it's false
-
true or true
是true
-
true and true
是true
-
true or false
是true
-
true and false
是false
-
false or false
是false
-
false and false
是false
使用括号对逻辑组合进行分组
这个不清楚:
firstname = 'john' and lastname = 'smith' OR firstname = 'mary' and lastname = 'jones'
它是这样的:
(firstname = 'john' and lastname = 'smith') OR (firstname = 'mary' and lastname = 'jones')
没有其他意义
firstname = 'john' and (lastname = 'smith' OR firstname = 'mary') and lastname = 'jones'
(firstname = 'john' and lastname = 'smith' OR firstname = 'mary') and lastname = 'jones'
firstname = 'john' and (lastname = 'smith' OR firstname = 'mary' and lastname = 'jones')