我现在使用了一个小的递归函数 - 我想重新使用它来显示页面上的所有内容,可能隐藏在占位符/面板中(可能在某些点视图中)
Public Shared Sub ShowAllPanels(ByVal parent As Control)
For Each c As Control In parent.Controls
If c.Controls.Count > 0 Then
ShowAllPanels(c)
Else
Select Case (c.GetType().ToString())
Case "System.Web.UI.WebControls.PlaceHolder"
CType(c, PlaceHolder).Visible = True
Case "System.Web.UI.WebControls.Panel"
CType(c, Panel).Visible = True
Case Else
System.Diagnostics.Debug.Write(c.GetType().ToString() + "")
End Select
End If
Next c
End Sub
我确信这样做有一个更简洁的方法,但我似乎无法轮询我的页面并找到面板或占位符。
我意识到我可以使用trycast - 并且使用GetType摆脱任何潜在的拼写错误 - 但调试返回的类型 - 不会出现类似于占位符的内容。
任何想法为什么?
答案 0 :(得分:1)
因为您正在检查c.Controls.Count > 0
我认为该面板和PlaceHolder是否属实。但在这种情况下,你只需跳过它并循环所有的儿童cotnrols。
所以这应该有效:
Public Shared Sub ShowAllPanels(ByVal parent As Control)
For Each c As Control In parent.Controls
Select Case (c.GetType().ToString())
Case "System.Web.UI.WebControls.PlaceHolder"
CType(c, PlaceHolder).Visible = True
Case "System.Web.UI.WebControls.Panel"
CType(c, Panel).Visible = True
Case Else
System.Diagnostics.Debug.Write(c.GetType().ToString() + "")
End Select
If c.Controls.Count > 0 Then
ShowAllPanels(c)
End If
Next c
End Sub
但是,这种通用方法更短,更易读,更可重复使用:
Public Shared Sub ShowControl(Of TCtrl As Control)(ByVal parent As Control, show As Boolean)
Dim children = parent.Controls.OfType(Of TCtrl)()
For Each child As TCtrl In children
child.Visible = show
ShowControl(Of TCtrl)(child, show)
Next
End Sub
你以这种方式使用它:
ShowControl(Of Panel)(Page, True)
ShowControl(Of PlaceHolder)(Page, True)