C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: CheckBoxのチェックマークの反映


(過去ログ 119 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■69644 / inTopicNo.1)  CheckBoxのチェックマークの反映
  
□投稿者/ ザイーガ (1回)-(2014/01/16(Thu) 15:02:49)

分類:[VB.NET/VB2005 以降] 

こんにちは。
CheckBoxのCheckedChangedイベントで、RichTextBoxのデータを処理するような処理を行っています。
ただ、この処理は数秒かかることもあり、例えばチェックボックスをクリックしても、
この処理が終了しないと、GUI上のチェックボックスのチェック表示が反映されません。
このため、利用者がチェックボックスのチェックがうまく反映されていないと誤解し、
何度もチェックボックスをクリックしてしまう恐れがあります。

そこで、色々と試していくうちに、チェックボックスのEnabled属性を切り替えることで
チェックボックス表示が反映されることが分かりました。
チェックボックスのチェック変更後の処理時にはチェックボックスのクリックを無効にしたいので、
例えば以下のようなコードを書いてみました。
(数秒かかる処理の代わりに、Thread.Sleepを使っています。)

Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
    CheckBox1.Enabled = False
    System.Threading.Thread.Sleep(2000)
    CheckBox1.Enabled = True
End Sub

これだと、クリック後のチェック表示は切り替わるのですが、
チェックボックスのEnabled = Falseの時にチェックボックスをクリックすると、
その時のチェックが無効にならず、Enabled = Trueに戻った後にまたチェック処理が走ってしまいます。

今回のケースで、チェックボックスのEnabled = Falseの時のクリックは無効にできないものでしょうか?

引用返信 編集キー/
■69645 / inTopicNo.2)  Re[1]: CheckBoxのチェックマークの反映
□投稿者/ 魔界の仮面弁士 (500回)-(2014/01/16(Thu) 15:52:29)
2014/01/17(Fri) 02:14:42 編集(投稿者)

No69644 (ザイーガ さん) に返信
> この処理が終了しないと、GUI上のチェックボックスのチェック表示が反映されません。
Refresh メソッドで反映されるかと思います。


> チェックボックスのEnabled = Falseの時にチェックボックスをクリックすると、
> その時のチェックが無効にならず、Enabled = Trueに戻った後にまたチェック処理が走ってしまいます。


'======= 案1 ======
' Enabled = True に戻す直前に DoEvents を入れる手法
'
' 修正量が少ないように見えますが、推奨される手法ではありません。
' http://msdn.microsoft.com/ja-jp/library/system.windows.forms.application.doevents.aspx
'
Public Class Form1
 Private Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles CheckBox1.CheckedChanged
  CheckBox1.Enabled = False
   :
   長い処理
   :
  Application.DoEvents()
  CheckBox1.Enabled = True
 End Sub
End Class


'======= 案2 ======
' Idle イベントで解除する手法
'
' 処理中は Enabled = False にしておき、クリック処理が無視されるようにします。
' Enabled = True に戻す処理は、CheckedChanged が終わった「後」で行う必要があるため
' Application_Idle や Timer_Tick などで処理させます。
'
Public Class Form1
 Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
  AddHandler Application.Idle, AddressOf App_Idle
 End Sub

 Private Sub App_Idle(ByVal sender As Object, ByVal e As EventArgs)
  CheckBox1.Enabled = True
 End Sub

 Private Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles CheckBox1.CheckedChanged
  CheckBox1.Refresh()
  CheckBox1.Enabled = False
   :
   長い処理
   :
 End Sub
End Class


'======= 案3 ======
' AutoCheck プロパティを利用
'
' 基本的には 案2 と同じですが、Enabled の状態が変わってしまうと
' 都合が悪いような場合に使えます。AutoCheck を False にすると、
' ReadOnly 状態となり、ユーザー操作による CheckedChanged が発生しません。
'
Public Class Form1
 Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
  AddHandler Application.Idle, AddressOf App_Idle
 End Sub

 Private Sub App_Idle(ByVal sender As Object, ByVal e As EventArgs)
  CheckBox1.AutoCheck = True
 End Sub

 Private Sub CheckBox1_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles CheckBox1.CheckedChanged
  CheckBox1.AutoCheck = False
  CheckBox1.Refresh()
   :
   長い処理
   :
 End Sub
End Class
引用返信 編集キー/
■69656 / inTopicNo.3)  Re[2]: CheckBoxのチェックマークの反映
□投稿者/ ザイーガ (2回)-(2014/01/17(Fri) 13:00:46)
魔界の仮面弁士様、ご回答ありがとうございました。
ご提案の案2を早速使わせて頂き、処理中(チェックボックスのEnabled=Falseの時)にクリックをした場合、
クリックを無効とすることができました。

お陰様で解決いたしました。ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -