用于循环用户控件的正确逻辑

时间:2011-09-20 16:52:05

标签: asp.net vb.net loops user-controls repeater

我有一个动态网页,可以多次加载用户控件,包括根据需要多次加载用户控件。在用户控件中有四个控件:标题标签,转发器,占位符和Repeater内的AjaxControlToolkit评级控件。

结构可能如下所示:

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 个答案:

答案 0 :(得分:1)

抱歉,我的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

答案 1 :(得分:0)

以下代码完全符合我的需求。我没有测试AjaxControlToolkit.Rating类型。

使用

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