- - PR -
コンボボックスとマウスホイールなどのイベント
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-09-15 03:23
いつも参考にさせていただいております。てぃろと申します。
以下についてどなたかご存知でしたら教えてください。 .NetFramework1.1 C# または VB.Net による開発で、 ウインドウズフォームにComboBox1を配置しています。 そのコンボボックスにはいくつかのアイテムが定義されています。 ComboBox1_SelectedIndexChangedには少々重い処理を行っています。 そこで、そのComboBox1にフォーカスが当たった状態でマウスのホイールを 動かすとSelectedIndexChangedイベントが発生します。 しかしホイールをたくさん動かすと、一瞬固まったようになり、 ComboBox1に選択されているアイテムは最終的な選択アイテムになります。 一番初めのSelectedIndexChangedイベントの処理中はそのComboBox1を ロックするような処理(SelectedIndexChangedイベントが実行されない) をしたいのですが、これは可能でしょうか? カーソルキーでも同じくです。 自分なりに考え、SelectedIndexChangedイベント発生直後に Enabled = falseとRefresh() をしてみたり・・lock、SyncLockが使えるのでは? と思ったのですが、解決できませんでした。 どうぞ宜しくお願いします。 | ||||||||
|
投稿日時: 2007-09-15 09:33
その「処理」の開始を単純に遅延させるだけでよいなら、タイマを使えばよいです。 ・フォームに Timer コンポーネントを配置 ・ComboBox.SelectedIndexChanged では Timer.Enabled = false し、すぐに Timer.Enabled = true するだけに変更 ・Timer.Tick イベントハンドラで Timer.Enabled = false とし、従来 ComboBox.SelectedIndexChanged で行っていた処理を実行 Timer.Interval の値は適当に調整してください。 # タイマの使用手順が間違っていたのを修正 [ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2007-09-15 11:51 ] | ||||||||
|
投稿日時: 2007-09-15 12:24
終わったなんて判断できねーしな。
最後に選択したアイテムだけで処理すればいいんならLeaveイベントとかでやったら? _________________ 質問する前にググレカス | ||||||||
|
投稿日時: 2007-09-15 23:39
渋木宏明(ひどり) さん、ぶさいくろうさん、貴重なお返事ありがとうございます。
タイマですか。確かに処理は遅延できそうですね、ですが、 いつ処理が終わるかはわからないのが・・。 処理中にはSQLサーバーとの通信も行っています。 Leaveイベントはちょっと試してみます。 | ||||||||
|
投稿日時: 2007-09-16 00:12
処理の遅延じゃなくて、処理の「開始の」遅延ね。
そういうレベルの話だと、「ComboBox で選択」にしたのが間違いなんじゃ? 実際の画面が分からないのでアレですが、リスト選択とか、タブ切り替えみたいなノリの画面構成に変更した方がよかったりしません? | ||||||||
|
投稿日時: 2007-09-18 21:14
1.1 環境は分かりませんが... SelectedIndexChanged はキーボードによるドロップダウン選択中も 発生するので SelectionChangeCommitted で処理を行うように した方が良いと思います。 連続選択の無効化は、 1. 処理開始時にフラグをたてる。 2. 処理中は KeyDown, KeyPress で e.Handled = true を指定し無視する。 3. 処理終了後のフラグ OFF 直前に Application.DoEvents() でキューに溜まったキーボードイベントを破棄する。 で、それなりに動くと思います。 (MouseWheel も KeyDown で処理されます) ただ、描画更新などを考えると、SelectionChangeCommitted から タイマーや PostMessage で遅延起動したほうがよいと思います。 また、選択のたびに待たされる UI は使いにくいので、 KeyDown で強制的に DroppedDown を行うのもありかも。 ただし、処理中でもマウスクリックによるドロップダウン 選択は行えるので Enabled なり他の対処は必要だと思います。 | ||||||||
|
投稿日時: 2007-09-18 21:50
SelectionChangeCommittedは1.1にはないんだよね。
| ||||||||
|
投稿日時: 2007-09-19 09:32
すいません、便乗で申し訳ないですが質問させてください。 このスレを見てSelectionChangeCommittedイベントのことを少し調べていたのですが、MSDNでは2つのページが出てきました。 1 ComboBox.SelectionChangeCommittedイベント 2 ComboBox.SelectionChangeCommittedイベント 1はMSDNライブラリで、2はMSDN2ライブラリです。 1の方にはバージョン情報などは書かれていないのですが、2の方にはバージョン情報のサポート対象に1.0、1.1、2.0があります。 しかし、2の方には「This page is specific to Microsoft Visual Studio 2005/.NET Framework 2.0」の文も書かれています。 この場合、2.0のみに含まれている機能と見るべきなのでしょうか。 それとも、1.0、1.1、2.0全てに含まれている機能と見てもよいのでしょうか。 私の思い違いでなければ、2.0で追加されたものに対しては「この機能は2.0より新しく追加されたもの」のような文があったと思うのですが・・・。 |