- PR -

[VB.NET] コンボボックスのDropDowm

投稿者投稿内容
バレル
会議室デビュー日: 2003/12/24
投稿数: 8
投稿日時: 2005-02-04 02:12
ComboBoxで、フォーカスを受け取った時に自動的にドロップダウンさせたいんですが、どうすれば良いでしょう?

よくある以下の様なコードでは、TABやEnterキーでフォーカスを受け取った場合には上手くいくのですが、マウスのクリックでドロップダウンさせようとした時には、「一瞬開いて、すぐ閉じる。」という風な挙動になってしまいます。

Private Sub ComboBox1_Enter(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles ComboBox1.Enter
ComboBox1.DroppedDown = True
End Sub
kanai
ベテラン
会議室デビュー日: 2004/09/13
投稿数: 98
投稿日時: 2005-02-04 09:22
「一瞬開いて、すぐ閉じる」のは、マウスのクリックでドロップダウンさせる前に、コードによってドロップダウンが開かれているためです。この挙動を回避するのは難しそうです。

あまり見栄えがよいとは思いませんが、Clickイベントにも
ComboBox1.DroppedDown = True
を記述すると、「一瞬開いて、一瞬閉じて、また開く」という挙動になります。
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-02-04 10:44
コンボボックスだけを貼り付けたユーザーコントロールにラップし、
ユーザーコントロールのTabStop=True(デフォルト)
コンボボックスのTabStop=False

ユーザーコントロールのGotFocusイベントで、
ComboBox1.DroppedDown =True

LostFocusイベントで
ComboBox1.DroppedDown =False

はどうでしょうか?


私の理解でこの動きが目的動作か微妙ですが
方法が無ければ試してください。

///////////////////サンプル//////////////////////////////
ユーザーコントロール:UserControl11
ユーザーコントロール内コンボボックス:ComboBox1

//フォーム初期化でサイズ調整//
UserControl11.ComboBox1.Top = 0
UserControl11.ComboBox1.Left = 0
UserControl11.Size = UserControl11.ComboBox1.Size




//イベント処理
Private Sub UserControl11_GotFocus(省略・・) Handles UserControl11.GotFocus
UserControl11.ComboBox1.DroppedDown = True
End Sub

Private Sub UserControl1_LostFocus(省略・・) Handles UserControl11.LostFocus
UserControl11.ComboBox1.DroppedDown = False
End Sub

※ロストフォーカスで明示的に戻さないと私の環境では動きませんでしたので。。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-02-04 12:23
じゃんぬねっと です。

引用:

Private Sub UserControl11_GotFocus(省略・・) Handles UserControl11.GotFocus
UserControl11.ComboBox1.DroppedDown = True
End Sub

Private Sub UserControl1_LostFocus(省略・・) Handles UserControl11.LostFocus
UserControl11.ComboBox1.DroppedDown = False
End Sub



低水準イベントである、GotFocus() イベントと、LostFocus() イベントではなく、
Enter() イベントと、Leave() イベントを使わないとまずいでしょうね。
_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
xxななおxx
ベテラン
会議室デビュー日: 2005/01/18
投稿数: 61
お住まい・勤務地: 東京(練馬)
投稿日時: 2005-02-04 12:51
Enter() イベントと、Leave() イベントを良く理解してませんでしたが、
”じゃんぬねっと”さんの提案方法でないと機能が満たせませんね。

GotFocus() イベントと、LostFocus() イベントだと、
「コンボボックスがドロップダウンされる」という視覚的動作しか変更できないので、
キーボード操作での選択ができません。

[ メッセージ編集済み 編集者: xxななおxx 編集日時 2005-02-04 12:55 ]

[ メッセージ編集済み 編集者: xxななおxx 編集日時 2005-02-04 12:56 ]

[ メッセージ編集済み 編集者: xxななおxx 編集日時 2005-02-04 13:09 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-02-04 14:53
じゃんぬねっと です。
ケチつけるような真似して、申し訳ありません。m(_ _)m

引用:

Enter() イベントと、Leave() イベントを良く理解してませんでしたが、
”じゃんぬねっと”さんの提案方法でないと機能が満たせませんね。
GotFocus() イベントと、LostFocus() イベントだと、
「コンボボックスがドロップダウンされる」という視覚的動作しか変更できないので、
キーボード操作での選択ができません。



それと、Form がアクティブになった際にも発生してしまうので危険ですよね。

引用:

ComboBoxで、フォーカスを受け取った時に自動的にドロップダウンさせたいんですが、どうすれば良いでしょう?



フォーカス取得時ではなく、[↓]矢印キーとか別のもので代用した方が、ユーザ フレンドリだと思いますが...
それと、Windows 標準が [F4] であることも、ご存知なのでしょうか?
_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Okayu3
会議室デビュー日: 2004/03/11
投稿数: 11
投稿日時: 2006-04-24 20:47
(この会議室には不適切との指摘がありましたので削除しました)

[ メッセージ編集済み 編集者: Okayu3 編集日時 2006-04-26 14:32 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-25 07:35
引用:

Okayu3さんの書き込み (2006-04-24 20:47) より:

DropDownStyle が DropDown のとき、という限定ならば
Cursor形状に目をつけることで、ほとんど実現できます。

1. クリックされているか、クリック位置がComboBox内かどうか判定。
→ MouseButtons , MousePosition で判別。
2. もし 内部でクリックされていたら
カーソル形状が Cursors.Arrow なら [v] の位置がクリックされたと
考えていいので、このときは Dropdown 動作を システムに任せる。

3. それ以外なら DroppedDown を trueに。

厳密には、部品の枠の位置でのクリックには対応できませんが
ほぼ問題ないでしょう。
VB.Net (not 2005) では うまく動いてます。

…なお、カーソル形状を見張る以外に、
マウスカーソル位置の 色を見てやる、という手もあるでしょう。


視覚テーマ (MSSTYLE) によって「揺らぎ」が発生しうる手法ですね。
ここまでやるのであれば、ウィンドウ メッセージ レベルで見た方が話が早いかもしれません。

個人的には、やはり OS 標準 の [F4] キーを使いましょうというところです。
(アクセシビリティ、ユーザビリティを考慮して)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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