2010-09-24 4 views
2

Я столкнулся с ситуацией, когда FindControl возвращал элемент управления, который не был полным совпадением идентификатора, который я искал. В родительском контроле есть два элемента управления с похожими идентификаторами типа «MyControl» и «MyControlAlternate». Когда я вызываю FindControl («MyControl»), возвращается элемент управления «MyControlAlternate». Мне было интересно, есть ли у кого-нибудь объяснения, почему или мысли о том, что может вызвать эту проблему. То, как я это обошлось, это реализовать мою собственную версию FindControl.FindControl возвращает неправильный контроль?

+2

Некоторые примеры кода могут помочь вам получить ответ. Поскольку с функцией FindControl существует определенное требование, в нем только возвращается динамически созданный элемент управления. Кроме того, они указывают, что вам, возможно, придется искать контейнер именования, чтобы получить необходимый вам элемент управления. – Josaph

+0

FindControl найдет все элементы управления - это не ограничивается динамически создаваемыми элементами управления. Однако я согласен с тем, что требуется пример нерабочего кода. –

ответ

1

По умолчанию метод FindControl по умолчанию использует собственный контейнер имен. Если это не работает, он пытается выполнить сопоставление образцов по имени. Это объясняет, почему вы получаете неправильный контроль - ваш контейнер именования неверен, и код превращает его в фазу соответствия шаблонов.

Вот dissassembly из 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 

Очевидно, что происходит в вашем примере, что вы не указываете правильный контейнер именования. Однако, не предоставляя пример кода, я не могу быть более конкретным, чем это.

+0

Основываясь на том, что вы говорите, является правдоподобной причиной, которая будет иметь общий смысл. Спасибо за отличный ответ – Achilles

Смежные вопросы