我创建了一个由许多自定义.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面板,如果它与它有任何关系。
感谢您提出任何建议。
答案 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
}