Este es el VB.Código NET que funcionó para mí:
<Extension()> _
Function FindChildControlById(ByVal controlToStartWith As Control, ByVal controlIdToFind As String) As Control
If controlToStartWith Is Nothing Then Return Nothing
If controlToStartWith.ID = controlIdToFind Then Return controlToStartWith
For Each childControl As Control In controlToStartWith.Controls
Dim resCtrl As Control = FindChildControlById(childControl, controlIdToFind)
If resCtrl IsNot Nothing Then Return resCtrl
Next childControl
Return Nothing
End Function ' Function FindChildControlById(ByVal controlToStartWith As Control, ByVal controlIdToFind As String) As Control
El crédito va a George por el código inicial de VB.NET. Solo lo modifiqué un poco, con 2 cambios funcionales: el mío no falla si/cuando nulo/Nada pasa como control de entrada, y el mío se implementa como una extensión. Mis otros 3 cambios menores no afectan la funcionalidad, pero para mí, fueron simplificaciones de código. Pero sé que es muy subjetivo.
Así que este método se puede utilizar con:
Dim c1 As Control = Page.FindChildControlById("aspControlID")
Y si quieres convertirlo en una clase secundaria específica de un control, así:
Dim c1 As Control = Page.FindChildControlById("aspControlID")
Dim c As HyperLink = TryCast(c1, HyperLink)
Actualización: Mi función es ahora llamado 'FindChildControlById' (anteriormente era 'FindMiControl'). Me gustó más la sugerencia de SpeedNet.
La forma en que Microsoft implementó esto es una broma, debería funcionar. Oh, tienes una página maestra? ¿Qué hay de 500 páginas maestras anidadas? El método debería resolverlo y hacer lo necesario para encontrar el control, punto. –
¿Sabes que estás usando "debería" y "Microsoft" en el mismo pensamiento? – user1566694