【问题标题】:Proper logic for looping through user controls循环用户控件的正确逻辑
【发布时间】:2011-09-20 16:52:05
【问题描述】:

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

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

【问题讨论】:

  • 是的,这就是我想要的,但我无法弄清楚它的逻辑。
  • 我尝试了递归,但由于某种原因,中继器项目似乎在混乱中丢失了。
  • 您可能还有其他问题,但可以肯定的是,您在中继器控件循环内对 Get_Rating 的调用中使用了错误的变量。您应该传递“rptctl”,但您传递的是“pesctl”(我认为是复制粘贴错误)。
  • 是的,我知道我的问题大声笑,无论如何,我注意到你所说的关于 rptctl 的说法,是有道理的。该方法的开头也是错误的,因为它依赖于 ctl 作为用户控件或传递的 ctl 的计数大于 0。我对此感到非常困惑

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


【解决方案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

【讨论】:

  • 谢谢 Matthew,我会试试这个并告诉你,它看起来很适合我
【解决方案2】:

下面的代码非常适合我的需要。我没有测试 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    相关资源
    最近更新 更多