primo luogo, si dovrebbe sapere che in realtà MasterPages siedono all'interno delle pagine. Tanto che l'evento Load di MasterPage viene effettivamente chiamato dopo l'evento Load dell'ASPX.
Ciò significa che l'oggetto Pagina è in realtà il controllo più alto nella gerarchia di controllo.
Quindi, sapendo questo, il modo migliore per trovare qualsiasi controllo in tale ambiente annidato, è scrivere una funzione ricorsiva che scorre attraverso ogni controllo e controllo figlio fino a trovare quello che stai cercando. in questo caso, le tue MasterPages sono in realtà controlli figlio del controllo Pagina principale.
Si arriva all'oggetto pagina principale dall'interno alcun controllo in questo modo:
C#:
this.Page;
VB.NET
Me.Page
Trovo che di solito, il metodo di controllo della classe FindControl() è abbastanza inutile, come l'ambiente è sempre annidato.
Perché se così fosse, ho deciso di utilizzare le 3.5 nuove estensioni di .NET per estendere la classe Control.
Utilizzando il codice qui sotto (VB.NET), nel dire, la cartella AppCode, tutti i controlli saranno ora peform un ritrovamento ricorsiva chiamando 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
Questo funziona perfettamente. Grazie. –
+1 grazie anche questo mi ha aiutato – leen3o
+1 so che questo è come 5 anni, ma questo metodo mi ha salvato un po 'di mal di testa, grazie! – psoshmo