Po pierwsze, należy wiedzieć, że MasterPages rzeczywiście siedzieć wewnątrz Pages. Tak bardzo, że zdarzenie Load strony MasterPage jest faktycznie wywoływane po zdarzeniu Load ASPX.
To oznacza, że obiekt strony jest w rzeczywistości najwyższą kontrolką w hierarchii kontroli.
Zatem, wiedząc o tym, najlepszym sposobem na znalezienie jakiejkolwiek kontroli w takim środowisku zagnieżdżonym, jest napisanie funkcji rekursywnej, która przechodzi przez wszystkie elementy sterujące i elementy podrzędne, dopóki nie znajdzie tego, którego szukasz. w takim przypadku strony wzorcowe są w rzeczywistości elementami podrzędnymi kontrolki głównej strony.
dostać się do głównego obiektu strony od wewnątrz jakiejkolwiek kontroli tak:
C#:
this.Page;
VB.NET
Me.Page
uważam, że zazwyczaj, metoda kontrolki klasa FindControl() jest całkiem bezużyteczny, ponieważ środowisko jest zawsze zagnieżdżone.
Bo jeśli tak, postanowiłem użyć 3.5 nowych funkcji rozszerzenia .NET, aby rozszerzyć klasę Kontroli.
za pomocą kodu poniżej (VB.NET), powiedzmy, folderu AppCode, wszystkie kontrole będą teraz peform rekurencyjną find wywołując 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
To działa idealnie. Dzięki. –
+1 dzięki temu również mi pomogło – leen3o
+1 Wiem, że to jest jak 5 lat, ale ta metoda uratowała mi trochę bólu głowy, dzięki! – psoshmo