【问题标题】:Reference .ASCX from .ASPX dynamically via ID通过 ID 从 .ASPX 动态引用 .ASCX
【发布时间】:2011-10-28 20:49:38
【问题描述】:

我创建了一个包含许多自定义 .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 什么也不返回。我可以将每个控件引用硬编码到这个函数中,但想知道是否有更优雅的方法。如果有任何关系,我也会使用母版页和内容面板。

感谢您的任何建议。

【问题讨论】:

标签: asp.net ascx findcontrol


【解决方案1】:

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)

【讨论】:

  • 太棒了!感谢您的代码定义。事实证明,我需要的用户控件位于页面容器中的表单容器中的内容容器中。每当我需要查找嵌套控件时,此扩展程序都会有所帮助。
  • @user1019084:很高兴能帮上忙。但是默认情况下您不应该使用此扩展程序。通常有更好的方法来查找对您正在寻找的控件的引用。此外,了解 ASP.NET 如何将控件嵌套到它们的 NamingContainers 中也很重要(例如,GridViewRow 中的 TextBox)。事实上,我从来不需要自己使用这个扩展。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多