2

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

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

任何想法为什么?

4

1 回答 1

1

因为您正在检查c.Controls.Count > 0我认为面板和 PlaceHolder 是否正确。但在这种情况下,您只需跳过它并循环所有子控件。

所以这应该工作:

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)
于 2013-09-03T11:36:36.207 回答