Fa3o Ответов: 3

Изменение цвета нескольких элементов управления (назад/вперед)vb.net


Привет.

Ну, у меня есть форма, загруженная большим количеством (Label/TextBox)s, и у меня есть опция переключения цвета в форме, и я использую простой код, который заключается в следующем:
TLab.ForeColor = My.Settings.B
HLine1.BackColor = My.Settings.B
HLine2.BackColor = My.Settings.B
UpdateLog.ForeColor = My.Settings.B

*Это всего лишь 4 элемента управления, мне нужно изменить почти 90 элементов управления.

Как вы можете видеть, я не только меняю задний цвет метки, но и меняю передний цвет неуверенной метки или текстового поля.

Что я уже пробовал:

Так что я думал о петле или о чем-то простом. следующим образом :Д:
Dim Obj = {TLab.ForeColor, HLine1.BackColor, HLine2.BackColor, UpdateLog.ForeColor}
For Each NC In Obj
    NC = My.Settings.B
Next


заранее спасибо :)

3 Ответов

Рейтинг:
22

Michael_Davies

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

Вероятно, лучше всего сделать это как рекурсивную функцию, так как вы можете иметь элементы управления контейнерами внутри элементов управления контейнерами, а приведенный ниже пример идет только на две глубины.

For Each x As Control In form1.Controls
           If x.HasChildren Then
           '
           ' Enumerate a containers controls
           '
               For Each z As Control In x.Controls
                       If TypeOf (z) Is CheckBox Then
                           ' Do what you want with a checkbox
                       ElseIf TypeOf (z) Is TextBox Then
                           ' etc.
                       ElseIf TypeOf (z) Is NumericUpDown Then
                           'etc.
                       ElseIf TypeOf (z) Is ComboBox Then
                           ' etc.
                       End If
           else
           '
           ' Not a container control, handle it
           '
              If TypeOf (z) Is CheckBox Then
                     ' Do what you want with a checkbox
              ElseIf TypeOf (z) Is TextBox Then
                     ' etc.
              ElseIf TypeOf (z) Is NumericUpDown Then
                     'etc.
              ElseIf TypeOf (z) Is ComboBox Then
                     ' etc.
              End If
           end if
 Next


Fa3o

Спасибо, что нашли время ответить, я действительно использую этот код:
На каждую клавишу Ctrl и контроля в контроля
Ctrl.Цвет Фона = Мой.Параметры.РНКБ
Ctrl.Свойство Forecolor = Мой.Параметры.МКФ
Следующий

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

Dim Obj = {TLab.ForeColor, HLine1.BackColor, HLine2.BackColor, UpdateLog.Цвет}

если нет решения, которое меня устраивает, я могу просто использовать старые коды.

Спасибо снова.

Michael_Davies

В этом случае несколько методов:

Используйте имя элемента управления, чтобы указать "не трогать", используйте префикс и проверьте имя перед установкой цвета.

или

Используйте поле тега элемента управления, дайте тегу значение для полей, которые вы не хотите изменять, затем проверьте тег элементов управления и оставьте его, если тег не является ничем.

Fa3o

Извините, что не ответил раньше, но я сделал так, как вы советовали, и воспользовался подсказкой "бирка".
На каждую клавишу Ctrl и контроля в контроля
При нажатой клавише Ctrl.Тег = "КЦБК", а затем клавишу Ctrl.Цвет Фона = Мой.Параметры.Б
Если ctrl.Tag = "FCCC", то ctrl.Свойство Forecolor = Мой.Параметры.Б
Следующий

Спасибо :D

Рейтинг:
15

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


Fa3o

Да, я последовал вашему с мистером Майклом совету. и это действительно сработало, спасибо :D

Рейтинг:
0

Member 14914654

Dim rnd как новый случайный

Если Label1.ForeColor = Видимый Тогда
Этикетка 1.FolorColor = Невидимый
Еще
Этикетка 1.ForColor = Цвет.FromArgb(rnd.Next(256), rnd.Next(256), rnd.Next(256))