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工作正常......我几乎就是你在VB中所说的菜鸟,所以有人帮帮我吗?塔

4

3 回答 3

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
于 2012-10-11T13:10:53.077 回答
1

它适用于我的表格。您确定将 state 设置为 true 值吗?许多人想在子例程中调暗一个名为“state”的变量,只是为了测试它。将 state 设置为 true 并禁用所有按钮。

尝试检索返回的控件计数。确保您正确引用控件。

演示将 boolean 设置为 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
于 2012-10-11T13:10:17.033 回答
0

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

首先,将ControlCollection 树线性化为 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
于 2012-10-11T13:58:33.873 回答