为什么占位符和面板不会出现在递归控件搜索中?

时间:2013-09-03 11:27:15

标签: asp.net .net vb.net recursion

我现在使用了一个小的递归函数 - 我想重新使用它来显示页面上的所有内容,可能隐藏在占位符/面板中(可能在某些点视图中)

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摆脱任何潜在的拼写错误 - 但调试返回的类型 - 不会出现类似于占位符的内容。

任何想法为什么?

1 个答案:

答案 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)