- PR -

コンボボックスとマウスホイールなどのイベント

投稿者投稿内容
てぃろ
常連さん
会議室デビュー日: 2007/07/01
投稿数: 23
投稿日時: 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が使えるのでは?
と思ったのですが、解決できませんでした。

どうぞ宜しくお願いします。

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-09-15 09:33
引用:

一番初めのSelectedIndexChangedイベントの処理中はそのComboBox1を
ロックするような処理(SelectedIndexChangedイベントが実行されない)
をしたいのですが、これは可能でしょうか?



その「処理」の開始を単純に遅延させるだけでよいなら、タイマを使えばよいです。

・フォームに Timer コンポーネントを配置
・ComboBox.SelectedIndexChanged では Timer.Enabled = false し、すぐに Timer.Enabled = true するだけに変更
・Timer.Tick イベントハンドラで Timer.Enabled = false とし、従来 ComboBox.SelectedIndexChanged で行っていた処理を実行

Timer.Interval の値は適当に調整してください。

# タイマの使用手順が間違っていたのを修正


[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2007-09-15 11:51 ]
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-09-15 12:24
終わったなんて判断できねーしな。
最後に選択したアイテムだけで処理すればいいんならLeaveイベントとかでやったら?
_________________
質問する前にググレカス
てぃろ
常連さん
会議室デビュー日: 2007/07/01
投稿数: 23
投稿日時: 2007-09-15 23:39
渋木宏明(ひどり) さん、ぶさいくろうさん、貴重なお返事ありがとうございます。

タイマですか。確かに処理は遅延できそうですね、ですが、
いつ処理が終わるかはわからないのが・・。
処理中にはSQLサーバーとの通信も行っています。

Leaveイベントはちょっと試してみます。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-09-16 00:12
引用:

タイマですか。確かに処理は遅延できそうですね、



処理の遅延じゃなくて、処理の「開始の」遅延ね。

引用:

いつ処理が終わるかはわからないのが・・。



そういうレベルの話だと、「ComboBox で選択」にしたのが間違いなんじゃ?

実際の画面が分からないのでアレですが、リスト選択とか、タブ切り替えみたいなノリの画面構成に変更した方がよかったりしません?
@echo
会議室デビュー日: 2005/01/19
投稿数: 18
投稿日時: 2007-09-18 21:14
引用:
.NetFramework1.1 C# または VB.Net による開発で、
ウインドウズフォームにComboBox1を配置しています。



1.1 環境は分かりませんが...

SelectedIndexChanged はキーボードによるドロップダウン選択中も
発生するので SelectionChangeCommitted で処理を行うように
した方が良いと思います。

連続選択の無効化は、

1. 処理開始時にフラグをたてる。
2. 処理中は KeyDown, KeyPress で e.Handled = true を指定し無視する。
3. 処理終了後のフラグ OFF 直前に Application.DoEvents() でキューに溜まったキーボードイベントを破棄する。

で、それなりに動くと思います。
(MouseWheel も KeyDown で処理されます)

ただ、描画更新などを考えると、SelectionChangeCommitted から
タイマーや PostMessage で遅延起動したほうがよいと思います。

また、選択のたびに待たされる UI は使いにくいので、
KeyDown で強制的に DroppedDown を行うのもありかも。

ただし、処理中でもマウスクリックによるドロップダウン
選択は行えるので Enabled なり他の対処は必要だと思います。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-09-18 21:50
SelectionChangeCommittedは1.1にはないんだよね。
nakaP
大ベテラン
会議室デビュー日: 2005/09/27
投稿数: 138
お住まい・勤務地: 高知
投稿日時: 2007-09-19 09:32
引用:

SelectionChangeCommittedは1.1にはないんだよね。



すいません、便乗で申し訳ないですが質問させてください。

このスレを見て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より新しく追加されたもの」のような文があったと思うのですが・・・。

スキルアップ/キャリアアップ(JOB@IT)