2023/04/18(Tue) 15:03:25 編集(投稿者)
■No101771 (夢ババ さん) に返信
> このチェックボックスのCheckedChangedイベントの最初で
> このチェックボックスのEnabledをFalseにして、
> このイベントの処理が終わってからこのチェックボックスのEnabledをTrueにする、
> ということを試してみましたが、
> このイベント処理中にチェックボックスをクリックしたことを記憶しているようで、
> このイベント処理が終わったとたんに再度CheckedChangedイベントが走りました。
フレームワークのバージョンが記入されていませんが、
非同期に対応しているバージョンならイベントにAsyncを付けて非同期にすればいいと思います。
Public Class Form1
Private Async Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
CheckBox1.Enabled = False
TextBox1.Clear()
TextBox1.AppendText("処理開始" & vbCrLf)
For i As Integer = 1 To 5
Await Task.Delay(1000)
TextBox1.AppendText($"{i}秒経過" & vbCrLf)
Next
TextBox1.AppendText("処理終了" & vbCrLf)
CheckBox1.Enabled = True
End Sub
End Class
非同期に対応していない場合は、BackgroundWorkerでチェックボックス処理を実行し、
RunWorkerCompletedイベントでチェックボックスを戻せばいいんじゃないでしょうか。
https://learn.microsoft.com/ja-jp/dotnet/api/system.componentmodel.backgroundworker
非同期にしない場合、イベントは内部的にキューに積まれて順次処理されるので、
CheckedChangedイベント内の処理が完了するまで、
他のイベント処理は待機されます。
そして、CheckedChangedイベント内でEnabledをTrue、Falseしたところで、
CheckedChangedイベントが終わった時点で、他のイベントが処理される前に
Enabledは元に戻っているので特に意味はありません。
Application.DoEventsで、強制的にキューに積まれているイベントを
実行させる事は可能ですが、Application.DoEventsの注意事項にある通り
Microsoftは非同期プログラミングを推奨しています。
イベントの完了状況の把握が困難になるので、私はDoEventsはお勧めしません。
https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.application.doevents