Правильная логика для циклического прохождения пользовательских элементов управления - PullRequest
0 голосов
/ 20 сентября 2011

У меня есть динамическая веб-страница, которая загружает пользовательский элемент управления несколько раз, включая загрузку пользовательского элемента управления внутри себя столько раз, сколько необходимо. В пользовательском элементе управления есть четыре элемента управления: метка заголовка, Repeater, Placeholder и в Repeater элемент управления AjaxControlToolkit Rating.

Структура может выглядеть следующим образом:

Webpage
  Placeholder
    UserControl (repeater hidden, no data)
      Placeholder - [UserControl]
        UserControl
          Repeater
            RepeaterItem - [RatingControl]
            RepeaterItem - [RatingControl]
          Placeholder - [UserControl]
            UserControl (placeholder hidden, no data)
              Repeater
                RepeaterItem - [RatingControl]
                RepeaterItem - [RatingControl]
    UserControl
      Repeater
        RepeaterItem - [RatingControl]
        RepeaterItem - [RatingControl]
      Placeholder - [UserControl]
        UserControl (placeholder hidden, no data)          
          Repeater
            RepeaterItem - [RatingControl]

Вот мой рекурсивный метод:

Protected Sub Get_Ratings(ByVal ctl As Control, ByVal grouptotal As Integer)
    If TypeOf ctl Is PerformanceEvaluationSubcontractorControl Then
        Dim pesctl As Control
        For Each pesctl In ctl.Controls
            If TypeOf pesctl Is PerformanceEvaluationSubcontractorControl Then
                Me.Get_Ratings(pesctl, grouptotal)
            ElseIf pesctl.Controls.Count > 0 Then
                Dim spesctl As Control
                For Each spesctl In pesctl.Controls
                    If TypeOf spesctl Is Repeater Then
                        Dim rptctl As Control
                        For Each rptctl In spesctl.Controls
                            Me.Get_Ratings(pesctl, grouptotal)
                        Next
                    End If
                    If TypeOf spesctl Is PlaceHolder Then
                        Dim plhctl As Control
                        For Each plhctl In spesctl.Controls
                            Me.Get_Ratings(plhctl, grouptotal)
                        Next
                    End If
                Next
            ElseIf TypeOf pesctl Is AjaxControlToolkit.Rating Then
                Dim ajrating As AjaxControlToolkit.Rating = pesctl
                grouptotal = grouptotal + ajrating.CurrentRating
            End If
        Next
    ElseIf ctl.Controls.Count > 0 Then
        Dim sctl As Control
        For Each sctl In ctl.Controls
            Me.Get_Ratings(sctl, grouptotal)
        Next
    End If
End Sub

У меня вопрос: как мне эффективно пройтись по структуре такого типа, чтобы найти элементы управления рейтингом?

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Извините, мой VB.NET не так уж и хорош, но рекурсивная функция не будет выглядеть примерно так:

Protected Function GetRatings(ByVal control As Control) As IEnumerable(Of AjaxControlToolkit.Rating)
  If (control.Controls.Count > 0) Then
    Dim result As New List(Of AjaxControlToolkit.Rating)()

    For Each child In Control.Controls
      Dim rating As AjaxControlToolkit.Rating = child As AjaxControlToolkit.Rating
      If Not (rating Is Nothing) Then
        result.Add(rating)
      Else
        result.AddRange(GetRatings(child))
      End If  
    Next

    Return result
  Else
    Return Enumerable.Empty(Of AjaxControlToolkit.Rating)()
  End If
End Function

Не могли бы вы тогда сделать суммирование:

Dim controls As IEnumerable(Of AjaxControlToolkit.Rating) = GetRatings(control)
Dim total As Int32 = Enumerable.Sum(Of AjaxControlToolkit.Rating)(_
    controls, Function(rating) rating.CurrentRating)

Если синтаксис выключен, дайте мне знать, я обычно не делаю VB.NET

0 голосов
/ 21 сентября 2011

Код ниже отлично подходит для моих нужд. Я не проверял тип AjaxControlToolkit.Rating.

Вызовите суб с помощью

 getcontrols(Page.Controls)

Вот суб

 Sub getcontrols(ByVal obControls As ControlCollection)
    Dim sContent As String = ""

    For Each childcontrol As Control In obControls

        If childcontrol.HasControls Then
            setcontent(childcontrol.Controls)
        End If

        If childcontrol.GetType() Is GetType(AjaxControlToolkit.Rating) Then

            Dim sID = CType(childcontrol, AjaxControlToolkit.Rating).ID
            'DO SOMETHING

        End If
    Next 
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...