FatzBomb
Майкл предлагает очень хорошее решение. Однако вы можете сократить свой код, если все элементы управления имеют определенный тип, используя параметр OfType(Of Type). Метки не являются контейнерными элементами управления, поэтому рекурсивная функция ниже бессмысленна, но вы можете использовать ее для любого типа элемента управления, который хотите.
' Put function in a sub using the parent control as a parameter so that the routine may be used for other objects. e.g. Pass Panel1 as MainParent and it will only affect the controls inside Panel1
Public Sub ChangeLabelColors(ByRef MainParent as Control)
' Check if there are any controls to change
If Not MainParent.HasChildren Then Exit Sub
'Use OfType to only enumerate Label controls
For Each x as Label in MainParent.Controls.OfType(Of Label)
' Recursively call the function for child container controls
If x.HasChildren Then ChangeLabelColors(x)
' Assuming you are using Michael's tag suggestion indication not to change that control's color (Very good idea), this will skip controls with the .Tag "Don't Change Me"
If Not x.Tag = "Don't Change Me" Then
x.BackColor = My.Settings.MCB
x.ForeColor = My.Settings.MCF
End If
Next
End Sub
Просто позвонить:
ChangeLabelColors(Me)
Кроме того, это может быть изменено, чтобы позволить вам также фильтровать тип. Это в основном решение Майкла, которое теперь позволяет рекурсию. Я также использовал Select Case by choice, я считаю, что это будет быстрее (не уверен в этом)
Public Sub ChangeControlColors(ByRef MainParent as Control)
If Not MainParent.HasChildren Then Exit Sub
For Each x as Control in MainParent.Controls()
Select Case True
Case TypeOf x Is Label, TypeOf x is Checkbox, TypeOf x is Panel
If x.HasChildren Then ChangeControlColors(x)
If Not x.Tag = "Don't Change Me" Then
x.BackColor = My.Settings.MCB
x.ForeColor = My.Settings.MCF
End If
End Select
Next
End Sub