у кого-нибудь есть функция vb.net, которая будет перебирать иерархию управления главной страницей? - PullRequest
0 голосов
/ 11 июня 2009

Есть ли у кого-нибудь функция, которая будет перебирать всю мастер-страницу / суб-мастер-страницу, которой принадлежит форма контента, и перебирать каждый элемент управления указанной мастер-страницей / суб-мастер-страницей?

Причина, по которой я спрашиваю, состоит в том, что я собираю все более запутанную стопку мастер-страниц и начинаю «терять» элементы управления - то есть не могу найти их, потому что они потеряны в иерархии.

Было бы неплохо иметь некоторую функцию, которая будет выводить дерево иерархии, чтобы я мог найти свои странные элементы управления.

1 Ответ

1 голос
/ 11 июня 2009

Вы можете сделать это довольно легко, используя рекурсивный метод. Если вы хотите проявить фантазию, вы можете даже использовать методы расширения, которые принимают некоторые делегаты в качестве параметров для большей гибкости.

Реализация метода так же проста, как удаление нового класса в вашей папке 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 и подтвердить, что он работает.

Надеюсь, это поможет:)

...