有没有人有一个vb.net函数,将遍历主页控制层次结构?

时间:2009-06-11 00:35:27

标签: asp.net vb.net master-pages

有没有人有一个函数会遍历内容表单所属的masterpage / sub主页,并遍历所述主页/子母版页的每个控件?

我之所以要问的是,我正在构建一个越来越混乱的主页,并开始“失去”控制 - 即无法找到它们,因为它们在层次结构中丢失了。

很高兴有一些函数可以转储层次结构树,这样我就可以找到我任意的控件了。

1 个答案:

答案 0 :(得分:1)

使用递归方法可以非常轻松地完成此操作。如果你想要花哨,你甚至可以使用扩展方法,将一些代理作为参数,以获得更大的灵活性。

实现该方法就像在App_Code文件夹中删除一个新类一样简单:

Public Module ControlParser
    Sub New()
    End Sub
    <System.Runtime.CompilerServices.Extension> _
    Public Sub ForEachRecursive(ByVal ctrl As Control, ByVal callback As Action(Of Control), ByVal onMethodEnter As Action, ByVal onMethodLeave As Action)
        onMethodEnter.Invoke()
        
        If ctrl Is Nothing Then
            Exit Sub
        End If
        
        callback(ctrl)
        
        For Each curCtrl As Control In ctrl.Controls
            ForEachRecursive(curCtrl, callback, onMethodEnter, onMethodLeave)
        Next
        
        onMethodLeave.Invoke()
    End Sub
End Module

从页面内部利用这个来遍历所有控件并在分层视图中打印出来可以这样完成:

Private depth As Int32 = -1
Private sbOutput As New StringBuilder()
Private Const SPACES_PER_TAB As Int32 = 4

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    Me.ForEachRecursive(PrintControl, Function() System.Math.Max(System.Threading.Interlocked.Increment(depth),depth - 1), Function() System.Math.Max(System.Threading.Interlocked.Decrement(depth),depth + 1))
    //Output is a panel on the page
    output.Controls.Add(New LiteralControl(sbOutput.ToString()))
End Sub

Public Sub PrintControl(ByVal c As Control)
    sbOutput.Append(GetTabs(depth) + c.ClientID & "<br />")
End Sub

Public Function GetTabs(ByVal tabs As Int32) As [String]
    Return If(tabs < 1, String.Empty, New [String]("*"c, tabs * SPACES_PER_TAB).Replace("*", "&nbsp;"))
End Function

我道歉,如果代码看起来很有趣,但我用C#编码并使用了转换器。但是,我能够将实际的 VB代码转储到我的App_Code目录中并确认它有效。

希望这会有所帮助:)