有没有人有一个函数会遍历内容表单所属的masterpage / sub主页,并遍历所述主页/子母版页的每个控件?
我之所以要问的是,我正在构建一个越来越混乱的主页,并开始“失去”控制 - 即无法找到它们,因为它们在层次结构中丢失了。
很高兴有一些函数可以转储层次结构树,这样我就可以找到我任意的控件了。
答案 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("*", " "))
End Function
我道歉,如果代码看起来很有趣,但我用C#编码并使用了转换器。但是,我能够将实际的 VB代码转储到我的App_Code目录中并确认它有效。
希望这会有所帮助:)