【问题标题】:FindControl returning wrong control?FindControl 返回错误的控件?
【发布时间】:2010-09-24 13:30:57
【问题描述】:

我遇到了FindControl 返回的控件与我搜索的 ID 不完全匹配的情况。父控件中有两个具有相似 ID 的控件,例如:“MyControl”和“MyControlAlternate”。当我调用FindControl("MyControl") 时,返回的控件是"MyControlAlternate"。 我想知道是否有人对可能导致此问题的原因或想法有任何解释。我解决这个问题的方法是实现我自己的FindControl 版本。

【问题讨论】:

  • 一些示例代码可能会帮助您获得答案。由于 FindControl 函数有一个特定要求,即它只返回动态创建的控件。此外,他们指定您可能必须搜索命名容器才能获得所需的控件。
  • FindControl 将查找所有控件 - 它不限于动态创建的控件。但是,我同意需要非工作代码的示例。

标签: .net asp.net vb.net


【解决方案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

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

【讨论】:

  • 根据您所说的是完全合理的合理原因。感谢您的精彩回答
猜你喜欢
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 2011-10-28
  • 2013-09-20
  • 2012-01-25
  • 1970-01-01
相关资源
最近更新 更多