遍历表单上的每个控件(包括容器中的控件)并用设置值替换文本占位符

时间:2015-06-11 10:56:18

标签: vb.net visual-studio-2013 controls

在我的项目中,我有一个名为 DriveLetter 的设置,我希望将此设置的值插入到表单上几个控件的文本中(替换占位符)。

我认为最简单的方法是循环遍历表单上的每个控件并搜索占位符,但通过反复试验,我发现我不能这样做(至少在我的方式中)因为我使用了容器,例如SplitContainerPanel

以下是我到目前为止所考虑的上述SplitContainerPanel容器,但是我如何修改它以循环遍历表单上的每个控件而无需显式检查如果当前控件是一种容器?

Private DRIVE_LETTER As String = My.Settings.DriveLetter

'**
' Handle form loading
''
Private Sub form_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

    ReplaceDriveLetter(Me)

End Sub

'**
' Update the value of the <DRIVE_LETTER> text placehoder
''
Private Sub ReplaceDriveLetter(ByVal ctrlContainer As Control)

    For Each ctrl As Control In ctrlContainer.Controls

        If TypeOf ctrl Is SplitContainer Or TypeOf ctrl Is Panel Then
            ReplaceDriveLetter(ctrl)
        Else
            ctrl.Text = Replace(ctrl.Text, "<DRIVE_LETTER>", UCase(DRIVE_LETTER))
        End If

    Next ctrl

End Sub

2 个答案:

答案 0 :(得分:3)

您还可以使用Control.HasChildren Property检查控件是否包含一个或多个子控件。

如MSDN所述,如果Controls集合的Count大于零,则HasChildren属性将返回true。如果控件没有子节点,则访问HasChildren属性不会强制创建Control.ControlCollection,因此引用此属性可以在遍历控件树时提供性能优势。

所以你可以改变你的功能:

Private Sub ReplaceDriveLetter(ByVal ctrlContainer As Control)

    For Each ctrl As Control In ctrlContainer.Controls

        If ctrl.HasChildren Then
            ReplaceDriveLetter(ctrl)
        Else
            ctrl.Text = Replace(ctrl.Text, "<DRIVE_LETTER>", UCase(DRIVE_LETTER))
        End If

    Next ctrl

End Sub

答案 1 :(得分:1)

这应该这样做,虽然显然用DriveLetter替换这里的文字(如果你愿意,我可以帮忙)。

Private Sub ReplaceAllControlsOnForm()
    Dim stackOfControls As New Stack(Of Control)

    'add initial controls (all on form)
    For Each c As Control In Me.Controls
        stackOfControls.Push(c)
    Next

    'go until no controls are left
    While (stackOfControls.Count > 0)
        Dim currControl As Control = stackOfControls.Pop
        currControl.Text = "text here"
        'see if our control can contain controls
        If (currControl.Controls IsNot Nothing AndAlso currControl.Controls.Count > 0) Then
            'add all of these controls onto our stack
            For Each c As Control In currControl.Controls
                stackOfControls.Push(c)
            Next
        End If
    End While
End Sub