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