Linearise ControlCollection tree into array of Control
- generic extension method, no recursion, LINQ
or GetNextControl
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| <System.Runtime.CompilerServices.Extension()>
Friend Function GetAllControlsOfType(Of T As Control)(ByVal controls As Control.ControlCollection) As T()
Dim controlsArray(controls.Count - 1) As Control
controls.CopyTo(controlsArray, 0)
Dim oldControlSieveList As New List(Of Control)(controlsArray)
Dim newControlSieveList As List(Of Control)
Dim targetControlList As New List(Of T)
While oldControlSieveList.Count > 0
newControlSieveList = New List(Of Control)
For Each parentControl As Control In oldControlSieveList
If parentControl.HasChildren Then
For Each childControl As Control In parentControl.Controls
newControlSieveList.Add(childControl)
Next
End If
If TypeOf parentControl Is T Then targetControlList.Add(parentControl)
Next
oldControlSieveList = newControlSieveList
End While
Return targetControlList.ToArray
End Function
|
See attached project for usage/sample (VB.NET 4.0, Visual Studio 2010).