コンボボックスのリストを入力値で制限する
コンボボックスのリストに表示されるデータが非常に多いので、選択するのに苦労します。そこで、コンボボックスのテキストボックス部にデータの一部を入力すると、リストのデータがそれを含むものに制限されるようにしています。↓↑キーで選択できるようにしたいですが、↓キーで選択しようとすると一番上のデータしか選択できません。
このような質問をみかけました。リストを入力値で制限する方法はWEBでさがせば見つかると思いますが、制限されたリストからマウスで選択するぶんにはいいのですが、↓キーで選択しようとしたとたんリストも制限されて、一番上しか選択できないという質問のような状況になります。
このような質問の対処法のサンプルを作成してみたので、紹介します。
難易度:
まずは、コンボボックスのリストを制限するコード。
仕様としては、コンボボックスの値集合ソースのテーブルは、
フィールド名 | データ型 |
---|---|
得意先コード | 数値型 主キー |
得意先名 | テキスト型 |
フリガナ | テキスト型 |
というようなフィールド構成とします。
テキストボックス部にフリガナの一部を入力すると、それと部分一致で得意先にリストが制限されるようにします。
プロパティ | 設定値 |
---|---|
名前 | cmb得意先 |
値集合ソース | SELECT 得意先名 FROM 得意先 ORDER BY フリガナ; |
連結列 | 1 |
自動拡張 | いいえ |
cmb得意先の変更時のイベントプロシージャ
上記はフリガナで制限してますが、得意先名で制限してもいいかもしれません。希望に合わせてWHERE句の条件を変更してください。
さて、上記のコンボボックスでカナを一文字でも入力するとリストがドロップダウンして部分一致で制限されたリストが表示されます。そのリストから2行目以降のデータを選択しようと、↓キーを押すと、テキストボックスに1行目のデータが表示されると同時に、リストは空になって、選択できなくなります。
↓キーでの選択でも変更時イベントは発生するので、選択された値でリストが制限されれば、リストには何も表示されないことになります。
↓↑キーを押したときは、変更時イベントが発生しないようにすればいいと考えられます。
キークリック時のイベントプロシージャ
実際に、サンプルを作成して試してみると、脳内シュミレーション通りでした。フリガナの一部を入力するとリストが制限されて、上下キーでそのリストから選択できました。めでたし、めでたし。
ただ、しばらく使ってみて、↓キーを押して一端選択してから、もう一度フリガナを入力しなおすときに選択した値を消して入力し直すのもちょっとスマートさにかけると思ったので、
1行目が選択されているときに↑キーを押したら、選択する前に入力したフリガナの一部に戻ってくれると、いいんではないかと思ったので、改良してみました。
キークリック時のイベントプロシージャ
これはなかなか調子いいです。場合によっては使えそうです。機会があったら使ってみよっと。
2011.05.19 追記
当方の掲示板で質問がありました。
「コンボボックスのリストを入力値で制限する」に関して
ドロップダウンリストをマウスでクリックして項目を選択した場合、ドロップダウンリストが開いたままになるのだか、通常の動作のように閉じるようにならないか、という内容です。確かに、不自然な動作ですね。
クリックイベントでフラグをたてて、それを見て、変更時に Dropdown するかどうか判断するようにしてみました。
2016.10.08 追記
コンボボックスに連結列以外の列を表示していると、選択後にフォーカス移動するとボックスが空白になります。
その場合は、フォーカス移動時に値集合ソースを抽出条件のないものに戻しておくことで対処できます。
2017.04.26 追記
制限
データシートビューでは最初の一文字を入力した時のみしかリストが制限されません。
条件付き書式が設定してあるコンボボックスでは動作しません。