1

すべてのボタンの有効化された状態をオンに設定できるようにしたい単純なvb2010フォームがあります。必要に応じて機能するチェックボックスと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でnoobと呼んでいるものとほぼ同じなので、誰かが私を助けてくれますか?Ta

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に設定し、すべてのボタンを無効にします。

返されたコントロールの数を取得してみてください。コントロールを正しく参照していることを確認します。

テスト用にブール値を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 に答える