En primer lugar, usted debe saber que MasterPages realidad se sientan dentro de las páginas. Tanto es así que el evento Load de MasterPage se llama realmente después del evento Load de su ASPX.
Esto significa que el objeto Página es en realidad el control más alto en la jerarquía de control.
Por lo tanto, sabiendo esto, la mejor manera de encontrar cualquier control en un entorno anidado, es escribir una función recursiva que recorre cada control y controles secundarios hasta encontrar el que está buscando. en este caso, sus páginas maestras son en realidad controles secundarios del control de la página principal.
Se llega al objeto de página principal desde el interior de cualquier control de la siguiente manera:
C#:
this.Page;
VB.NET
Me.Page
Me parece que por lo general, el método de control de la clase FindControl() es bastante inútil, ya que el ambiente siempre está anidado.
Porque si esto, he decidido utilizar .NET 3.5 nuevas características de Extensión para extender la clase de Control.
Al utilizar el código de abajo (VB.NET), en, por ejemplo, la carpeta de AppCode, todos sus controles serán ahora peform una búsqueda recursiva llamando 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
Esto funciona perfectamente. Gracias. –
+1 gracias esto también me ayudó – leen3o
+1 Sé que esto es como 5 años, pero este método me salvó un poco de dolor de cabeza, ¡gracias! – psoshmo