Вы можете сделать это довольно легко, используя рекурсивный метод. Если вы хотите проявить фантазию, вы можете даже использовать методы расширения, которые принимают некоторые делегаты в качестве параметров для большей гибкости.
Реализация метода так же проста, как удаление нового класса в вашей папке 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("*", " "))
End Function
Я прошу прощения, если код выглядит смешно, но я написал это на C # и использовал конвертер. Однако мне удалось выгрузить фактический VB-код в мой каталог App_Code и подтвердить, что он работает.
Надеюсь, это поможет:)