Как найти элементы управления метками внутри формы и ее вложенных панелей? - PullRequest
0 голосов
/ 08 декабря 2018

Мне нужно изменить цвет фона всех надписей внутри формы и вложенных панелей.

Я пробовал этот код, но он изменяет только цвет надписей, находящихся внутри формы, а невсе ярлыки внутри панелей.

  For Each Label As Control In Me.Controls
      If Label.GetType.ToString = "System.Windows.Forms.panel" Then
          Label.BackColor = Color.AliceBlue
      End If
  Next

Моя форма выглядит следующим образом:

Form

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Ответ, который разделяет Джими, довольно хорош для вопроса.Но я хотел бы поделиться более общим ответом, который показывает, как вы можете использовать Методы расширения , Функции итератора , LINQ и Enumerable методы расширения.

Получить все потомки элементов управления (потомки, потомки потомков, ...)

Вы можете создать метод расширения для вывода списка всех потомков элемента управления.При написании этого метода вы можете легко использовать функции итератора и рекурсивные функции для возврата IEnumerable<Control>:

Imports System.Runtime.CompilerServices
Module ControlExtensions

    <Extension()> 
    Public Iterator Function DescendantControls(c As Control) As IEnumerable(Of Control)
        For Each c1 As Control In c.Controls
            Yield c1
            For Each c2 As Control In c1.DescendantControls()
                Yield c2
            Next 
        Next
    End Function

End Module

Затем вы можете использовать метод расширения для получения всех потомков и использовать OfType для фильтрациидля конкретного типа управления:

For Each c In Me.DescendantControls().OfType(Of Label)
    c.BackColor = Color.AliceBlue
Next
0 голосов
/ 08 декабря 2018

Вы можете настроить простой рекурсивный метод, который анализирует все элементы управления в форме.

Если элемент управления в коллекции имеет тип Label, установите свойство BackColor.
Когда элемент управления содержит другие элементы управления, проанализируйте его коллекцию Controls, чтобы увидеть, содержит ли он некоторые метки;когда он найден, установите его BackColor.

Вызовите метод:

SetLabelsColor(Me, Color.AliceBlue)

Рекурсивный метод:

Private Sub SetLabelsColor(parent As Control, color As Color)
    If (parent Is Nothing) OrElse (Not parent.HasChildren) Then Return
    For Each ctl As Control In parent.Controls.OfType(Of Control)
        If TypeOf ctl Is Label Then
            ctl.BackColor = color
        Else
            If ctl.HasChildren Then
                SetLabelsColor(ctl, color)
            End If
        End If
    Next
End Sub

Если вы хотите изменить метки, которые находятся внутри панелей, а не других контейнеров, вы можете изменить условие, запускающее рекурсию:

If (TypeOf ctl Is Panel) AndAlso (ctl.HasChildren) Then
    SetLabelsColor(ctl, color)
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...