.ASPX ішінен .ASCX динамикалық ID арқылы

Мен көптеген .ascx басқару элементтерінен тұратын .aspx бетін құрдым және әрбір басқару элементіне арналған құралдың кеңесін жасайтын бет функциясын жасағым келеді. Әрбір .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 ештеңені қайтармайды. Мен осы функцияға әрбір басқару сілтемесін қатаң кодпен алуға болар едім, алайда неғұрлым талғампаз жол бар ма деп ойладым. Сондай-ақ, мен онымен байланысты нәрсе болса, Мастер бетін және Мазмұн тақтасын пайдаланамын.

Ұсыныстарыңызға рахмет.

0
Мүмкін, бұл көмектеседі: sharpertutorials.com/recursive-findcontrol , себебі басқару элементтері контейнердің қандай да бір түрі болуы мүмкін . Мен жай ғана жөнелтуші сіз іздеген бақылау емес, бірақ әртүрлі басқару элементі деп ойлайсыз ба?
қосылды автор Ruben, көзі

2 жауаптар

FindControl does not search within nested controls recursively. It does only find controls that's NamingContainer is the Control on that you are calling FindControl.

ASP.Net әдепкі бойынша өзіңіздің ішкі басқару элементтеріңізді қайталанбайтын түрде қарастырмайды:

  • Өнімділік
  • Қателерді болдырмау
  • Өңдеу

Қалай болса да, басқару элементтерін рекурсивті табу керек болса, барлық басқару элементтері мен олардың еншілес элементтерін айналдыру керек. Бұл кеңейтімді пайдалану:

Public Module ControlExtensions
    
    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: Мен көмектесе алатыныма қуаныштымын. Бірақ бұл кеңейтімді әдепкі бойынша пайдалануыңыз керек. Әдетте сіз іздеген басқару элементіне сілтеме табудың жақсы жолдары бар. Сонымен қатар, ASP.NET ұяшықтарын NamingContainers (мысалы, TextBox GridViewRow ) ішінде қалай басқаратындығын түсіну маңызды. Іс жүзінде, бұл кеңейтімді өзім пайдалану үшін ешқашан қажеттілік болмады.
қосылды автор Tim Schmelter, көзі
Тамаша! Кодын анықтау үшін рахмет. Маған қажет пайдаланушы басқару элементі бет контейнерінде орналасқан пішін контейнерінде орналасқан контент контейнерінде орналасқан. Бұл кеңейтім кірістірілген басқаруды табу қажет болғанда көмектесуі керек.
қосылды автор user1019084, көзі

Пайдаланушы басқару элементтері үшін контейнердің қандай да бір түрін пайдаланып жатсаңыз, сіз келесідей нәрсені жасай аласыз:

foreach (MyUserControl ctrl in PlaceHolder1.Controls.OfType())
{
    //add tooltip for each user control
}
0
қосылды