Проблема в том, что тип c вашего * generic List
равен Form
, а в классе Form
нет члена с именем Panel4
. У вас есть несколько определенных c типов, каждый из которых имеет определенный c член с таким именем, но общее имя в любом случае не делает их одним и тем же членом. Есть несколько способов справиться с этим.
Во-первых, быстрый и грязный способ. Это небольшая настройка того, что вы уже делаете:
Dim forms As Form() = {Basic, Easy, Medium, Hard, Advanced}
For Each frm In forms
For Each lbl As Label In frm.Controls("Panel4").Controls.OfType(Of Label)
lbl.ForeColor = Color.White
Next
Next
Обратите внимание, что первое изменение заключается в использовании массива для хранения форм, а не коллекции. Весь смысл коллекционирования в том, что он растет и сжимается по мере необходимости. Если вы никогда не меняете список после его создания, какой в этом смысл?
Хотя важное изменение заключается во внутреннем l oop. Класс Form
имеет свойство Controls
, и вы можете индексировать его по имени, чтобы получить указанный c элемент управления. Все ваши Panels
имеют одинаковые имена, так что вы можете использовать эту технику, чтобы получить доступ к каждому. Это возвращает ссылку Control
, но это все, что вам нужно, чтобы получить коллекцию Controls
для доступа к каждому Label
.
. Правильный способ справиться с этим - начать с создания базовой формы с один или несколько указанных c членов, а затем получая из этого все остальные пять ваших форм. Такая форма может содержать такой код:
Public Class ColouredLabelForm
Protected Property LabelPanel As Panel
Public Sub SetLabelForeColors(colour As Color)
For Each lbl In LabelPanel.Controls.OfType(Of Label)()
lbl.ForeColor = colour
Next
End Sub
End Class
Каждая из ваших производных форм может выглядеть следующим образом:
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
LabelPanel = Panel4
End Sub
End Class
Код для изменения всех Labels
становится таким :
Dim forms As ColouredLabelForm() = {Basic, Easy, Medium, Hard, Advanced}
For Each frm In forms
frm.SetLabelForeColors(Color.White)
Next
Правильный способ внесения изменений в элементы управления или данные в формах - ВСЕГДА заставить форму делать это самостоятельно, а не делать это с формой извне. Вы говорите форме, что делать снаружи, а затем форма делает это.