代码之家  ›  专栏  ›  技术社区  ›  Achilles

FindControl返回错误的控件?

  •  2
  • Achilles  · 技术社区  · 15 年前

    FindControl 返回的控件与我搜索的Id不完全匹配。parentcontrol中有两个具有类似ID的控件,如:“MyControl”和“MyControlAlternate”。当我打电话的时候 find控件 (“MyControl”)返回的控件是“MyControlAlternate”。 find控件 .

    1 回复  |  直到 15 年前
        1
  •  1
  •   NightOwl888 Jabrwoky    15 年前

    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
    

    推荐文章