首先,你应该知道,MasterPages实际上坐在页面内。以至于在ASPX的Load事件之后实际调用MasterPage的Load事件。
这意味着,页面对象实际上是控件层次结构中的最高控件。
因此,了解这一点,在这样的嵌套环境中找到任何控件的最佳方法是编写一个递归函数,循环遍历每个控件和子控件,直到找到您要找的控件和子控件。在这种情况下,您的MasterPages实际上是主页控件的子控件。
您可以从任何像这样的控制中得到的主要Page对象:
C#:
this.Page;
VB.NET
Me.Page
我发现,通常情况下,控制的类的FindControl()方法是很没用,因为环境总是嵌套。
因为如果这样,我决定使用.NET 3.5的新扩展功能来扩展Control类。
通过使用下面的代码(VB.NET),在说,你AppCode文件夹,所有控件现在将通过调用FindByControlID一个[执行递归查找()
Public Module ControlExtensions
<System.Runtime.CompilerServices.Extension()> _
Public Function FindControlByID(ByRef SourceControl As Control, ByRef ControlID As String) As Control
If Not String.IsNullOrEmpty(ControlID) Then
Return FindControlHelper(Of Control)(SourceControl.Controls, ControlID)
Else
Return Nothing
End If
End Function
Private Function FindControlHelper(Of GenericControlType)(ByVal ConCol As ControlCollection, ByRef ControlID As String) As Control
Dim RetControl As Control
For Each Con As Control In ConCol
If ControlID IsNot Nothing Then
If Con.ID = ControlID Then
Return Con
End If
Else
If TypeOf Con Is GenericControlType Then
Return Con
End If
End If
If Con.HasControls Then
If ControlID IsNot Nothing Then
RetControl = FindControlByID(Con, ControlID)
Else
RetControl = FindControlByType(Of GenericControlType)(Con)
End If
If RetControl IsNot Nothing Then
Return RetControl
End If
End If
Next
Return Nothing
End Function
End Module
这很好用。谢谢。 – 2010-10-17 22:27:05
+1谢谢,这也帮我出了 – leen3o 2010-12-02 10:03:08