Ссылка .ASCX из .ASPX динамически через идентификатор - PullRequest
0 голосов
/ 29 октября 2011

Я создал страницу .aspx, которая состоит из множества пользовательских элементов управления .ascx, и я хотел бы создать функцию страницы, которая генерирует всплывающую подсказку для каждого элемента управления. Я создал интерфейс, который каждый элемент управления .ascx реализует для создания всплывающей подсказки (функция называется GetToolTipInfo (), поэтому все, что мне сейчас нужно, это способ динамически ссылаться на элемент управления .ascx по его идентификатору.

Вот функция, которую я сейчас пытаюсь использовать ...

Protected Sub SetToolTip(sender As Object, args As ToolTipUpdateEventArgs)
    Dim control As New Literal()
    Dim info As ToolTipInfo = CType(Me.FindControl(args.TargetControlID).Parent, FormFunction).GetToolTipInfo()

    control.Text = info.content
    RadToolTipManagerMain.Width = info.width
    RadToolTipManagerMain.Position = info.position

    args.UpdatePanel.ContentTemplateContainer.Controls.Clear()
    args.UpdatePanel.ContentTemplateContainer.Controls.Add(control)
End Sub

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

Спасибо за любые предложения.

Ответы [ 2 ]

0 голосов
/ 29 октября 2011

Если вы используете какой-либо тип контейнера для пользовательских элементов управления, вы должны иметь возможность сделать что-то вроде этого:

foreach (MyUserControl ctrl in PlaceHolder1.Controls.OfType<MyUserControl>())
{
    //add tooltip for each user control
}
0 голосов
/ 29 октября 2011

FindControl не выполняет рекурсивный поиск во вложенных элементах управления. Он находит только те элементы управления, которые NamingContainer являются элементами управления, для которых вы вызываете FindControl.

Существует причина, по которой ASP.Net по умолчанию не просматривает ваши вложенные элементы управления:

  • Performance
  • Как избежать ошибок
  • Повторное использование

В любом случае, если вы хотите рекурсивно находить элементы управления, вам нужно перебрать все элементы управления и их дочерние элементы управления. Используйте это расширение:

Public Module ControlExtensions
    <Runtime.CompilerServices.Extension()>
    Public Function FindControlRecursive(ByVal rootControl As Control, ByVal controlID As String) As Control
        If rootControl.ID = controlID Then
            Return rootControl
        End If

        For Each controlToSearch As Control In rootControl.Controls
            Dim controlToReturn As Control = FindControlRecursive(controlToSearch, controlID)
            If controlToReturn IsNot Nothing Then
                Return controlToReturn
            End If
        Next
        Return Nothing
    End Function
End Module

Примечание: эта функция чувствительна к регистру!

Элемент управления можно найти следующим образом:

Dim info = Page.FindControlRecursive(args.TargetControlID)
...