在ASP.NET中,Panel服务器控件一般用来作为容器控件,来成组的隐藏和显示一些控件,大部分情况下直接设置Panel的visualable属性为True或者False就可以达到目的,但是有一些情况下,例如对整个页面进行validate时,但是在一个隐藏的Panel中,有RequiredValidate控件,它校验的控件由于和Panel一起被隐藏,所以它是无法通过校验的,那么页面的validate由于有一个Validate控件不能通过,自然也不能通过。而我们的初衷是被隐藏的控件是不需要校验的。
要解决这个问题,需要在Panel隐藏时,需要查找Panel中的所有Validate子控件,告诉它们在进行Validate时它们可以忽略,而在显示Panel时,又重新设置。
这种方法比直接隐藏或显示Panel控件消耗更多的资源,所以要区分不同的情况进行使用,如果Panel中没有校验控件,那么直接隐藏或显示Panel控件就可以了,而如果Panel中有校验控件,最好就用本文的方式来隐藏或显示它。
这段代码从.Net Framework SDK的示例Duwamish中直接拿来。
'----------------------------------------------------------------
' Sub ShowPanel:
' Helper sub used to make certain that the validators do not
' fire when their parent panel is not visible.
'----------------------------------------------------------------
Public Shared Sub ShowPanel(ByRef panel As Panel, ByVal visible As Boolean)
Dim validator As IValidator
Dim ctrl As Control
For Each ctrl In panel.Controls
'check to see if its a validator
If TypeOf ctrl Is IValidator Then
validator = CType(ctrl, IValidator)
ctrl.Visible = visible
If Not visible Then
validator.Validate()
End If
End If
Next
panel.Visible = visible
End Sub
' Sub ShowPanel:
' Helper sub used to make certain that the validators do not
' fire when their parent panel is not visible.
'----------------------------------------------------------------
Public Shared Sub ShowPanel(ByRef panel As Panel, ByVal visible As Boolean)
Dim validator As IValidator
Dim ctrl As Control
For Each ctrl In panel.Controls
'check to see if its a validator
If TypeOf ctrl Is IValidator Then
validator = CType(ctrl, IValidator)
ctrl.Visible = visible
If Not visible Then
validator.Validate()
End If
End If
Next
panel.Visible = visible
End Sub