我有一个动态网页,可以多次加载用户控件,包括根据需要多次加载用户控件。在用户控件中有四个控件:标题标签,转发器,占位符和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
我的问题是,如何有效地循环这种类型的结构以找到评级控件?
答案 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