FindControl返回错误的控件?

时间:2010-09-24 13:30:57

标签: .net asp.net vb.net

我遇到了FindControl正在返回一个与我正在搜索的ID完全匹配的控件的情况。 parentcontrol中有两个控件,类似的ID如:“MyControl”和“MyControlAlternate”。当我调用FindControl(“MyControl”)时,返回的控件是“MyControlAlternate”。 我想知道是否有人解释为什么或想到可能导致这个问题的原因。我解决这个问题的方法是实现我自己的FindControl版本。

1 个答案:

答案 0 :(得分:1)

FindControl的默认行为是使用自己的命名容器。如果这不起作用,它会尝试对名称进行模式匹配。这可以解释为什么你得到了错误的控制 - 你的命名容器不正确,代码正在进入模式匹配阶段。

以下是来自Reflector的FindControl的反汇编:

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

显然,您的示例中发生的是您没有指定正确的命名容器。但是,如果没有提供代码示例,我就不能比这更具体了。