FindControl的默认行为是使用自己的命名容器。如果不起作用,它会尝试对名称进行模式匹配。这就解释了为什么您得到了错误的控件—您的命名容器不正确,代码正在进入模式匹配阶段。
以下是FindControl与Reflector的分解:
Public Overridable Function FindControl(ByVal id As String) As Control
Return Me.FindControl(id, 0)
End Function
Protected Overridable Function FindControl(ByVal id As String, ByVal pathOffset As Integer) As Control
Dim str As String
Me.EnsureChildControls
If Not Me.flags.Item(&H80) Then
Dim namingContainer As Control = Me.NamingContainer
If (Not namingContainer Is Nothing) Then
Return namingContainer.FindControl(id, pathOffset)
End If
Return Nothing
End If
If (Me.HasControls AndAlso (Me._occasionalFields.NamedControls Is Nothing)) Then
Me.EnsureNamedControlsTable
End If
If ((Me._occasionalFields Is Nothing) OrElse (Me._occasionalFields.NamedControls Is Nothing)) Then
Return Nothing
End If
Dim anyOf As Char() = New Char() { "$"c, ":"c }
Dim num As Integer = id.IndexOfAny(anyOf, pathOffset)
If (num = -1) Then
str = id.Substring(pathOffset)
Return TryCast(Me._occasionalFields.NamedControls.Item(str),Control)
End If
str = id.Substring(pathOffset, (num - pathOffset))
Dim control2 As Control = TryCast(Me._occasionalFields.NamedControls.Item(str),Control)
If (control2 Is Nothing) Then
Return Nothing
End If
Return control2.FindControl(id, (num + 1))
End Function