通过用户控件进行循环的适当逻辑



我有一个动态网页,它多次加载用户控件,包括根据需要多次加载用户控件。在用户控件中有四个控件:Title Label, 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

我的问题是,我如何有效地循环这种类型的结构来找到评级控制?

对不起,我的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。净

下面的代码完美地满足了我的需求。我没有测试AjaxControlToolkit。评级类型。

调用sub
 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

最新更新