通过ID动态地从.ASPX引用.ASCX

时间:2011-10-28 20:49:38

标签: asp.net ascx findcontrol

我创建了一个由许多自定义.ascx控件组成的.aspx页面,我想创建一个页面函数,为每个控件生成一个工具提示。我创建了一个接口,每个.ascx控件都实现了创建工具提示(该函数称为GetToolTipInfo(),所以我现在需要的是一种通过它的ID动态引用.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什么都不返回。我可以将每个控件引用硬编码到这个函数中,但是想知道是否有更优雅的方法。我也使用Master页面和Content面板,如果它与它有任何关系。

感谢您提出任何建议。

2 个答案:

答案 0 :(得分:0)

FindControl不会递归搜索嵌套控件。它只能找到NamingContainer 是您正在调用FindControl的控件的控件。

这是一个原因,默认情况下,ASP.Net不会递归地查看您的嵌套控件:

  • 性能
  • 避免错误
  • 复用性

无论如何,如果要以递归方式查找控件,则必须遍历所有控件及其子控件。使用此扩展程序:

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)

答案 1 :(得分:0)

如果您正在为用户控件使用某种类型的容器,那么您应该能够执行以下操作:

foreach (MyUserControl ctrl in PlaceHolder1.Controls.OfType<MyUserControl>())
{
    //add tooltip for each user control
}