読者です 読者をやめる 読者になる 読者になる

bigLiBox

備忘録だったり。読書メモだったり。ところで仕事が終わりそうにないんですが。

フォーム内のすべてのボタンを非活性にする

ボタンの2重押下防止としてボタンをすべて非活性にしてみたかった件。
全部のボタンコントロールを1個1個コード書くのは大変なので、
コントロールをすべて取得する。

 ''' <summary>
    ''' 使用可能コントロール(ボタン)切替処理
    ''' </summary>
    ''' <param name="hParent">切り替え対象コントロール</param>
    ''' <param name="enable">活性化:True、非活性化:False</param>
    Public Shared Sub ChangeButtonEnabled(ByVal hParent As Control, ByVal enable As Boolean)

        ' hParent 内のすべてのコントロールを取得する
        For Each cControl As Control In hParent.Controls
            ' 列挙したコントロールにコントロールが含まれている場合は再帰呼び出しする
            If cControl.HasChildren Then
                ChangeButtonEnabled(cControl, enable)
            End If

            ' コントロールの型が Button の場合、Enabledプロパティを切り替える
            If TypeOf cControl Is Button Then
                cControl.Enabled = enable
            End If
        Next cControl

    End Sub

これでボタンを非活性にすることはできたが、
非活性にしてても、その間に非活性されているボタンを押下すると
あとからボタン押下イベントが発生する。。。

ボタンの2重押下防止の方法はいろいろ試したけど
どうにも意図した通りに動かないので
BackgroundWorkerで時間のかかる処理を実行させることにした。

別スレッドでやるなら、ボタンを非活性じゃなくて
フォーム毎非活性にすることにしたよ。

Delegate Sub CallbackChangeEnabled(ByVal enable As Boolean)

''' <summary>
''' 使用可能コントロール切替処理
''' </summary>
''' <remarks></remarks>
Private Sub ChangeEnabled(ByVal enable As Boolean)
    If Me.InvokeRequired Then
        Dim d As New CallbackChangeEnabled(AddressOf ChangeEnabled)
        Me.Invoke(d)
    Else
        Me.Enabled = enable
    End If
End Sub

参考: