DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォーム上のコントロールのロックについて

環境/言語:[Windows2000 VS2005 .NET Framework2.0]
分類:[.NET]

初心者です。
VS2005、VBで開発しています。検索処理など時間がかかる処理を行う際に、フォーム上のコントロールをグレーアウトし、操作不可状態にしたいです。
VB6のときは、Form.Enabled=False とするだけで、ロック状態(操作を受け付けない)になっていたと思います。しかし、VS2005でForm.Enabled=False としても、グレーアウトの状態にはなりますが、マウスクリック等のイベントが発生してしまいます。
わかりにくいかと思いますが、
1 検索処理開始(ボタンのクリックイベント)
    ↓
2 クリックイベント内でForm.Enabled=Falseにする。
    ↓
3 検索処理中、フォームの×ボタンを押す
    ↓
4 ボタンのクリックイベント終了後にフォームが閉じる
  (イベント中のフォーム上の操作を不可としたい!!)

という現象でこまっています。
ちなみにマウスのアイコンを変えても、Application.UseWaitCursor = True にしても、同様の現象が起こっています。
どなたかフォーム上のコントロールをグレーアウトし、操作不可状態にする方法をご存知ないでしょうか?
1つ1つのコントロールに対してEnabledプロパティを設定する必要があるのでしょうか?
よろしくお願い致します。
2005 なら、BackgroundWorker を使用してマルチスレッドでやるというのはどうでしょう。

ところで、それでは検索を途中でキャンセルすることもできませんがいいんでしょうか?
キャンセルボタンが付いた検索中ダイアログを出すというのがよくあるパターンですが。
■No15707に返信(Hongliangさんの記事)
> 2005 なら、BackgroundWorker を使用してマルチスレッドでやるというのはどうでしょう。
> 
> ところで、それでは検索を途中でキャンセルすることもできませんがいいんでしょうか?
> キャンセルボタンが付いた検索中ダイアログを出すというのがよくあるパターンですが。

ご回答ありがとうございます。

今回3層のシステムなので、UI部では、DBセッション管理をうまく行うことができません。
何回も重たい検索を実行→キャンセル を繰り返すと、
いらないセッションが残ってシステム全体に負荷がかかる
という理由で、キャンセル機能は設けず、DBアクセス中は画面の操作を受け付けないようにしたい と思っています。

ご指摘のあった
BackgroundWorker についてヘルプで調べてみました。
BackgroundWorkerは、画面の操作と検索処理を2つのスレッド?を立てるという意味
でしょうか?
これでは、画面の操作が行われてしまうと思うのですが、
認識の誤りでしょうか???

VS2005の知識がないので、聞いてばかりで申し訳ないですが、
よろしくお願い致します。
> BackgroundWorkerは、画面の操作と検索処理を2つのスレッド?を立てるという意味
> でしょうか?
> これでは、画面の操作が行われてしまうと思うのですが、
> 認識の誤りでしょうか???

Enabled = False にしていても処理中の操作が処理終了後に有効になってしまうのは、メッセージの処理が処理中キューに溜まってしまうのが原因です。
つまり、Enabled = False > 処理 > Enabled = True > 後回しにされていた入力の処理、という流れになってしまいます。入力の処理が、ボタンのクリックイベントで登録したメソッドの完了後(Enabled = True にしたあと)に行われるわけですね。
マルチスレッドなら、上記の「処理」と平行して入力の処理を常時行うようになります。そしてその間 Enabled = False になっていれば、入力を無視できるようになるわけです。
つまり、ボタンクリック > Enabled = False > BackgroundWorker の RunWorkerAsync 呼び出し(これでクリックイベントを処理するメソッドは終了) > BackgroundWorker の RunWorkerCompleted イベントで結果の表示と Enabled = True
初心者にもわかるような明快なご説明ありがとうございました!!
早速試してみましたが、 BackgroundWorkerを使えばやりたいことができそうです。
わざわざ BackgroundWorkerを使わなければいけないところが大変そうですが。。。
VB6とVS2005でかなり変わってしまっているんですね。
勉強しなければなりませんね。
Hongliangさん 本当にありがとうございました!!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板