我有一个简单的vb 2010表单,我希望能够设置所有按钮的启用声明。 我已经根据需要为复选框和numericUpDown控件创建了类似的函数,但对于按钮,函数似乎无法正常运行。
Private Sub setButtonsState(ByVal state As Boolean)
Dim cControl As Control
For Each cControl In Me.Controls
If (TypeOf cControl Is Button) Then
cControl.Enabled = state
End If
Next cControl
End Sub
这样称呼:setButtonsState(True)
这似乎对按钮没有任何影响,但buttonName.Enabled = True
工作正常......
我几乎就是你在VB上称之为菜鸟的人,所以任何人都可以帮助我吗?
TA
答案 0 :(得分:4)
除非你的所有按钮都直接属于表格,否则它们不会被访问,因为它不会通过控制树向下游来到达它们。稍微不同的方法可能是一种更加递归的方法:
Private Sub setButtonsState(ByVal controls as System.Windows.Forms.Control.ControlCollection, ByVal state as Boolean)
For Each ctrl as Control in controls
If (ctrl.HasChildren) Then setButtonsState(ctrl.Controls, state)
If (TypeOf ctrl Is Button) Then ctrl.Enabled = state
Next
End Sub
答案 1 :(得分:1)
它适用于我的表格。您确定要将状态设置为真值吗?你们很多人想在子程序中调暗一个名为“state”的变量来测试它。将状态设置为true并禁用所有按钮。
尝试检索返回的控件数。确保您正确引用控件。
将测试布尔值设为True以进行测试:
*Dim state As Boolean = True*
Dim cControl As Control
For Each cControl In Me.Controls
If (TypeOf cControl Is Button) Then
cControl.Enabled = state
End If
Next cControl
检查控件数量:
For Each cControl In (Your Form Name Ex. FrmMain1).Controls
If (TypeOf cControl Is Button) Then
cControl.Enabled = state
*debug.writeline(cControl.Name)*
End If
Next cControl
答案 2 :(得分:0)
如果可能的话,我建议你避免递归。下面的方法具有更好的调试能力。
首先,Linearise ControlCollection tree进入Control数组 - 泛型扩展方法,无递归,LINQ或GetNextControl。
然后你可以这样写:
Private Sub setButtonsState(ByVal controls As ControlCollection, ByVal state As Boolean)
For Each ctrl As Control In controls.GetAllControlsOfType(Of Button)()
ctrl.Enabled = state
Next
End Sub