2011-09-20 29 views
0

我有一個動態網頁多次加載用戶控件,包括根據需要多次加載用戶控件。在用戶控件中有四個控件:標題標籤,轉發器,佔位符和轉發器內的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 

我的問題是,我怎麼通過這種類型的結構有效地循環找評級控制?

+0

遞歸函數。 – N0Alias

+0

是的,這是我想要去的,但我無法弄清楚它的邏輯。 – mattgcon

+0

我嘗試了遞歸,但由於某種原因,轉發器項目似乎在混亂的事情中迷失了方向。 – mattgcon

回答

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

+0

感謝Matthew,我將嘗試這一點並且讓你知道,它看起來適合我 – mattgcon

+0

馬修,我將如何在JavaScript中編碼? – mattgcon

+0

謝謝你馬修精美的工作 – mattgcon

0

下面的代碼工作完全滿足我的需求。我沒有測試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