首页 > 解决方案 > 循环访问自定义控件类

问题描述

我想在启动时使用一个函数将多个属性应用于自定义控件类。

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 个拨动开关(命名ToggleSwitch1ToggleSwitch5),但由于某种原因,我找不到解决方案。
有关情况的更多信息:

我创建了一个带有 TabControl 的表单,开关位于TabPage1.
拨动开关是定制的(JCS.ToggleSwitch来自 CodeProject)

标签: vb.netwinformsclass

解决方案


您可以将控件分组到一个数组中并迭代此临时集合以设置所有引用的控件的属性。您可以按名称调用这些控件,即使它们不是父窗体的直接子级(它们是另一个容器的子级,在本例中是 TabControl 的 TabPage)。

请注意,您使用的 aFunction不返回值,Sub而是改为 a 。
( static)Shared方法似乎不适合引用控件实例。
另请参阅此方法是否需要Public。可能不是。
让我们做它internalFriend),看看它是否可以。

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。
您还可以使用递归方法搜索和设置特定类型的所有控件的属性,这些控件位于容器或其任何子容器内(在本例中为 aTabPageTabControl)。
在这种情况下,您不需要指定受影响控件的所有名称:该方法将修改它在指定容器中找到的所有控件。

TabControl在您的情况下,您可以使用包含您的ToggleSwitch控件作为参数 的 来调用此方法:

编辑
代码缺少 cast: 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

推荐阅读