2011-10-28 55 views
0

我創建了一個由許多自定義.ascx控件組成的.aspx頁面,並且我想創建一個頁面函數來爲每個控件生成一個工具提示。我已經創建了一個接口,每個.ascx控件實現創建工具提示(該函數稱爲GetToolTipInfo()),所以我現在需要的是通過它的ID動態引用.ascx控件的方法。從.ASPX通過ID動態引用.ASCX

Here目前我正在嘗試使用的功能...

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已返回任何內容,我可以硬編碼每個控制引用到這個功能,但不知道是否有一個更優雅的方式。我我也在使用母版頁和內容面板(如果這與它有任何關係)

謝謝你的任何建議

+0

也許這有助於:http://sharpertutorials.com/recursive-findcontrol/,因爲控件可能在某種容器中。我只是認爲發件人不是你正在尋找的控件,而是一些不同的控件? – Ruben

回答

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) 
+0

太棒了!感謝您的代碼定義。事實證明,我需要的用戶控件位於位於頁面容器中的表單容器中的內容容器中。每當我需要找到一個嵌套控件時,這個擴展應該有所幫助。 – user1019084

+0

@ user1019084:我很高興能幫上忙。但是你不應該默認使用這個擴展。通常有更好的方法來找到你正在尋找的控制的參考。此外,瞭解如何將ASP.NET嵌套控件納入其NamingContainer(例如,「GridViewRow」中的「TextBox」)非常重要。事實上,我從來不需要自己使用這個擴展。 –

0

如果您正在使用某種類型的用戶控件的容器,你應該能夠做這樣的事情:

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