Цикл пользовательских классов управления - PullRequest
0 голосов
/ 24 февраля 2019

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

Public Shared Function ToggleSwitchProperties()
    Form1.ToggleSwitch1.OnText = "ON"
    Form1.ToggleSwitch1.OnFont = New Font(Form1.Font.FontFamily, 8, FontStyle.Bold)
    Form1.ToggleSwitch1.OnForeColor = Color.White
    Form1.ToggleSwitch1.OffText = "OFF"
    Form1.ToggleSwitch1.OffFont = New Font(Form1.Font.FontFamily, 8, FontStyle.Bold)
    Form1.ToggleSwitch1.OffForeColor = Color.White
End Function

Это то, что я имею до сих пор.Я хотел бы применить эти настройки к 5 другим тумблерам (названным от ToggleSwitch1 до ToggleSwitch5), но по какой-то причине я не могу найти решение.
Еще немного информации о ситуации:

Я создал форму с TabControl на ней, и переключатели расположены на TabPage1.
Тумблеры изготовлены на заказ (JCS.ToggleSwitch из CodeProject)

1 Ответ

0 голосов
/ 24 февраля 2019

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

Обратите внимание, что вы используете Function, который не возвращает значение, что делает его Sub.
A static (Shared) метод не подходит для ссылки на экземпляры элементов управления.
Смотрите также, должен ли этот метод быть Public.Вероятно, нет.
Давайте сделаем это internal (Friend) и посмотрим, все ли в порядке.

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ToggleSwitchProperties()
End Sub

Friend Sub ToggleSwitchProperties()
    For Each tSwitch As ToggleSwitch In {ToggleSwitch1, ToggleSwitch2, ToggleSwitch3, ToggleSwitch4, ToggleSwitch5}
        tSwitch.OnText = "ON"
        tSwitch.OnFont = New Font(Form1.Font.FontFamily, 8, FontStyle.Bold)
        tSwitch.OnForeColor = Color.White
        tSwitch.OffText = "OFF"
        '(... all other settings ...)
    Next
End Function

Вариант 2.
Вы также можете использовать рекурсивный метод, который ищет и задает свойства всех элементов управления определенного типа, которые находятся внутри контейнера или любого его элемента.-containers (в данном случае TabPage внутри TabControl).
В этом случае вам не нужно указывать все имена затронутых элементов управления: метод модифицирует все элементы управления, найденные внутриуказанный контейнер.

В вашем случае вы можете вызвать этот метод, используя TabControl, который содержит ваш ToggleSwitch элемент управления в качестве аргумента:

EDIT :
В коде отсутствует приведение: Dim tSwitch = DirectCast(ctl, ToggleSwitch), что не позволяет коду работать должным образом.Теперь добавил обратно.

ToggleSwitchProperties(TabControl1)

Friend Sub ToggleSwitchProperties(ctlParent As Control)

    If (ctlParent Is Nothing) OrElse (Not ctlParent.HasChildren) Then Return
    For Each ctl As Control In ctlParent.Controls.OfType(Of Control)
        If TypeOf ctl Is ToggleSwitch Then
            Dim tSwitch = DirectCast(ctl, ToggleSwitch)
            tSwitch.OnText = "ON"
            tSwitch.OnFont = New Font(Form1.Font.FontFamily, 8, FontStyle.Bold)
            '(... all other settings ...)
        Else
            If ctl.HasChildren Then
                ToggleSwitchProperties(ctl)
            End If
        End If
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...