フォーム内のすべてのボタンを非活性にする
ボタンの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
参考: