我有一个需要有选择地显示或隐藏大量控件的网页。每个控件的可见性是根据3个条件中的哪一个确定的。
因此,例如,给定条件A,B和C;
如果每个控件都查看了每个条件,那么控制逻辑将是丑陋的,但是可行。
If A Then
If B Then
If C Then
Else
End If
Else
If C Then
Else
End If
End If
Else
If B Then
If C Then
Else
End If
Else
If C Then
Else
End If
End If
End If
但不幸的是,当你混合使用许多控件只关心3个条件中的1个或2个时,代码开始变成维护噩梦。以下是所有26种可能的条件:
A False B Any C Any
A True B Any C Any
A Any B Any C False
A False B Any C False
A True B Any C False
A Any B Any C True
A False B Any C True
A True B Any C True
A Any B False C Any
A False B False C Any
A True B False C Any
A Any B False C False
A False B False C False
A True B False C False
A Any B False C True
A False B False C True
A True B False C True
A Any B True C Any
A False B True C Any
A True B True C Any
A Any B True C False
A False B True C False
A True B True C False
A Any B True C True
A False B True C True
A True B True C True
是否有更好的模式来处理多个条件的检查?
修改 我已经开始沿着Marcelo Cantos建议的路走下去,但我的A,B和C条件很长。所以我做了一个帮手功能:
Dim isMatch = Function(A As Boolean?, B As Boolean?, C As Boolean?) As Boolean
Return (Not A.HasValue OrElse A.Value = SomeLongConditionA) _
AndAlso (Not B.HasValue OrElse B.Value = SomeLongConditionB) _
AndAlso (Not C.HasValue OrElse C.Value = SomeLongConditionC)
End Function
Control1.Visible = isMatch(True, True, False)
Control2.Visible = isMatch(False, True, True)
Control3.Visible = isMatch(True, Nothing, True)
答案 0 :(得分:15)
Control1.Visible = A And B And Not C
Control2.Visible = Not A And B And C
Control3.Visible = A And C
...
请注意,此表单类似于您提供的规则的说明。这是思考大多数问题的好方法:“我怎样才能使代码看起来像我对问题的描述?”
编辑:如果A,B和C表示冗长的表达式,则不必将这些表达式复制粘贴到每一行,也不必编写辅助函数。只需预先计算值:
Dim A As Boolean = SomeLongConditionA
Dim B As Boolean = SomeLongConditionB
Dim C As Boolean = SomeLongConditionC
Control1.Visible = A And B And Not C
...
另请注意,这将比辅助函数快得多,这可以节省打字时间,但仍会多次评估条件。
答案 1 :(得分:1)
通过控制对条件进行分组会不会更容易:
If A And B And Not C Then
Control1.Visible = True
End If
If Not A And B And C Then
Control2.Visible = True
End If
If A And C Then
Control3.Visible = True
End If
编辑:或者,在这种处理控件的布尔属性的特殊情况下,Marcelo Cantos的答案提供了更简单易读的方法来执行相同的操作。