2012-10-11 66 views
1

我有一个简单的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作品OK ...... Im相当多,你想叫什么,在VB一个小白,所以任何人帮帮我? Ta

回答

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 
+0

这可能是由于按钮位于组框中。然而,给出的错误“'HasControls'不是'System.Windows.Forms.Control'的成员。”... – Toby

+1

我想他可能是.haschildren例如...如果(ctrl.HasChildren)那么。 ..*继续。 – Ccorock

+0

试图更改为hasChildren,但然后为setButtonsState(ctrl.Controls,状态)发生未处理的invalidCast的消息 – Toby

1

它适用于我的表格。你确定你正在将状态设置为真正的值吗?你很多想要在子程序内调暗一个名为“状态”的变量来测试它。将状态设置为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 
+0

使用表单名称给出了一个错误:“‘Test1.FormName’不能通过其默认实例指本身,使用‘我’而不是” – Toby

+0

设置状态=真正的内部子不工作,所以必须是实际的逻辑本身,这是奇怪的考虑到它适用于其他控制类型我迄今尝试过......感谢您的帮助。 – Toby

+1

然后划痕。尝试改为debug.writeline(Button1.Parent.Name.Tostring),这应该证明该窗体实际上是该控件的父窗体,否则它会给你控件的父窗体。 – Ccorock

0

我建议你避免递归,如果可能的话。下面的方法具有更好的调试能力。

首先,Linearise ControlCollection tree进入控制数组 - 通用扩展方法,无递归,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 
+0

作为一个noob两个Q的A)为什么避免递归B)在你的例如是不是从状态改变子移动到getAllControlsOfType子递归? Ta – Toby

+1

@Toby:A)因为你不容易调试它,假设你有100个按钮嵌套在9个级别。递归,你甚至不知道他们是否都被你的代码拾起。通过上述方法,您可以在监视屏幕中查看它们,查看按钮计数等。B)否,getAllControlsOfType不会自行调用。 – Neolisk

+0

Thanks @Neolisk :) – Toby