在我的项目中,我有一个名为 DriveLetter 的设置,我希望将此设置的值插入到表单上几个控件的文本中(替换占位符)。
我认为最简单的方法是循环遍历表单上的每个控件并搜索占位符,但通过反复试验,我发现我不能这样做(至少在我的方式中)因为我使用了容器,例如SplitContainer
和Panel
。
以下是我到目前为止所考虑的上述SplitContainer
和Panel
容器,但是我如何修改它以循环遍历表单上的每个控件而无需显式检查如果当前控件是一种容器?
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
答案 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