「みんな教えて! 選手権!!」開催のお知らせ

いつもお世話になります。

VB.NET2003で開発しています。
いままで全然気にしておらず、質問が来て初めて気がつきましたが、
現在使っているコンボボックスに現れるデータはすべて8個なんですね。

これをもっと多くするにはどうしたらいいのでしょうか?
また最大表示出来る数はいくらなのでしょうか?

初歩的な質問で恐縮ですがよろしくお願いします。

A 回答 (7件)

MaxDropDownItemsプロパティを設定すれば変更できます。

    • good
    • 0
この回答へのお礼

danchorです。 早速のご教示ありがとうございます。

これが個々に設定出来れば作業の効率がグンと上がり、喜んでもらえそうです。
早速改訂して配布することにします。

ついでで申し訳ないのですが、確かこのドロップダウンリストに表示させる順番も変えれたような記憶があるのですが・・・。
すなわち何も指定しなかったときには5番目に表示されるがそれを1番上にして以降順番にでるようにみたいに。

でもそうすると1~4番目は後ろに廻る? それとも無視される??
すみません。 よろしくお願いいたします。

お礼日時:2007/01/19 08:43

★追記


・『SendMessage』関数の戻り値や引数にキャストをつけていません。
・分かりやすくするために取り除いています。
・このため、いろいろと警告などが表示されると思いますが、そこは質問者さんが
・キャストを上手につけて下さい。
・以上。おわり。
    • good
    • 0
この回答へのお礼

Oh-Orangeさん 再度のご教示ありがとうございます。

「学習機能」・・・・そんなものできっこない! といとも簡単にあきらめていましたが、な~るほど! と感心しきり!

考え方をしっかり理解・整理してぜひ活用させていただきます。
 
「もっともっとあくなき探求心が必要」だと痛感したもうすぐ還暦近いおっさんの独り言でした。

ありがとうございました。

お礼日時:2007/01/22 12:25

★どうやら回答者 No.5 さんの考えが近いようですね。


・FEP のような学習機能を実現するにはコンボボックスのデータ項目1つ1つに
 インデックス番号(支店名コード)などを関連付けてセット(管理)します。
 この関連付けは『CB_SETITEMDATA』というメッセージで行えます。
・その後、ユーザさんが選択したデータ項目を最上位に移動させます。
・移動はデータ項目と関連付けたインデックス番号(支店名コード)をペアで行います。
・移動は『選択位置の取得』→『選択位置の削除』→『先頭位置への挿入』という
 3ステップが基本です。
・これで使用頻度が高い順に最上位にデータ項目が移っていきます。
 これが学習機能ですね。
・下に簡単なサンプルを載せますが、C/C++ ですよ。

サンプル:初期設定(フォームに読み込ませる最初)
static LPCTSTR lpTable[] = { 文字列0番 … 文字列100番, NULL };
LPCTSTR *lpSeek = lpTable;
INT nIndex; ←インデックス番号(支店名コード)

for ( nIndex = 0 ; *lpSeek != NULL ; nIndex++ ){
 SendMessage( Combo.hWnd, CB_INSERTSTRING, nIndex, *lpSeek ); ←データ項目(支店名・文字列)
 SendMessage( Combo.hWnd, CB_SETITEMDATA, nIndex, nIndex ); ←インデックス番号を関連付ける
 lpSeek++;
}

サンプル:学習機能(選択した項目を上位に移動)
TCHAR szBuffer[ 256 ]; ←文字列領域
INT nSelect; ←選択位置
INT nIndex; ←インデックス番号(支店名コード)

nSelect = SendMessage( Combo.hWnd, CB_GETCURSEL, 0, 0 ); ←選択位置の取得
nIndex = SendMessage( Combo.hWnd, CB_GETITEMDATA, nSelect, 0 ); ←選択位置のインデックス番号を取得
SendMessage( Combo.hWnd, CB_GETLBTEXT, nSelect, szBuffer ); ←選択位置の文字列取得
SendMessage( Combo.hWnd, CB_DELETESTRING, nSelect, 0 ); ←選択位置の削除
SendMessage( Combo.hWnd, CB_INSERTSTRING, 0, szBuffer ); ←先頭位置への挿入
SendMessage( Combo.hWnd, CB_SETITEMDATA, 0, nIndex ); ←先頭位置へインデックス番号を関連付ける

サンプル:項目位置取得(選択している項目のインデックス番号を取得)
INT nSelect; ←選択位置
INT nIndex; ←インデックス番号(支店名コード)

nSelect = SendMessage( Combo.hWnd, CB_GETCURSEL, 0, 0 ); ←選択位置の取得
nIndex = SendMessage( Combo.hWnd, CB_GETITEMDATA, nSelect, 0 ); ←選択位置のインデックス番号を取得
return( nIndex ); ←これがインデックス番号(支店名コード)になります

最後に:
・言葉での説明が難しいので C/C++ での実装例を交えました。
・上記の部分だけでは学習機能が不揮発性ですのでソフトを終了してしまうと、次の起動で初期化されて
 しまいます。これを防ぐにはファイルへ使用頻度順のコンボボックスの『学習インデックス情報』を
 保存します。また、次の起動にそのファイルを読み込んで使用頻度順に再現させる必要があります。
・まずは、上記の部分を組み込んで『学習機能』ぽいのを実感(体感?)してみて下さい。
・以上。一旦おわりにします。→また何かコメントを…。
    • good
    • 0

質問の意図が


1
2
3
4
5
と表示されているアイテムの3を選択した場合、
3
1
2
4
5
と表示したいのかと思いましたが、No.4さんの言われていることで
あれば、ItemsコレクションのInsertメソッドで実現できますね。

この回答への補足

danchorです。 いつもありがとうございます。

質問の仕方が悪くて申し訳ありません。
今データが







100
として
何もしなければ上のように現れるリストをたとえば






100
と表示させることができたとしたときに、1~4はどこに表示されるのかなぁ?と思ったわけです。

現実にはこのデータは1~100まであらかじめフォームが読み込まれたときにセットされていますが、使う人(支店)によっては自分に必要なリストが常に上位にでて欲しいという要求があるためです。
FEPのような学習機能があればいいのでしょうがそこまでの技術力がないためにお知恵を拝借したいと考えた次第です。

補足日時:2007/01/22 08:48
    • good
    • 0

★私は C/C++ 言語ですが、ドロップダウンリストの順序は変更できますよ。


・ただ、Visual Basic で簡単に変更できるかは知りませんが…。
・ということで今後の参考にして下さい。

紹介:
・コンボボックスという GUI 部品を操作するには通常は、その部品に対して
 いろいろな動作の指示を CB_xxxxx メッセージを送信してやり取りします。
・『CB_RESETCONTENT』は、データ項目をすべてクリア。
・『CB_GETCOUNT』は、データ項目の数を取得。
・『CB_GETCURSEL』は、選択位置を取得。
・『CB_SETCURSEL』は、選択位置を設定。
・『CB_FINDSTRING』は、文字列を検索してその位置を取得。
・『CB_SELECTSTRING』は、選択位置の文字列を取得。
・『CB_INSERTSTRING』は、指定位置に文字列を挿入。 ←※
・『CB_ADDSTRING』は、一番下に文字列を追加。
・『CB_DELETESTRING』は、指定位置の文字列を削除。
・上記以外にもいろいろと CB_xxxxx メッセージがあります。

本題:
・それで通常は『CB_ADDSTRING』メッセージで一番下に文字列を追加します。
・そしてある時『CB_INSERTSTRING』メッセージで一番上に文字列を挿入するように
 指定すれば回答者 No.2 さんの『回答へのお礼』が実現できます。
・これらの操作は『PostMessage』、『SendMessage』、『SendDlgItemMessage』の
 API 関数などで行います。→Visual Basic で簡単に呼び出せますか?

書式:
・『SendMessage( hWnd, CB_ADDSTRING, 0, 文字列配列 );』
・『SendMessage( hWnd, CB_INSERTSTRING, 挿入位置(0から始まる), 挿入文字列 );』
・『hWnd』がコンボボックスのウインドウ・ハンドルです。
・以上。おわり。

参考URL:http://wisdom.sakura.ne.jp/system/winapi/windata …
    • good
    • 0
この回答へのお礼

Oh-Orangeさん おはようございます。
ご教示ありがとうございます。

質問の仕方が悪くて済みません。
意図するところはNO.5さんへの補足に書かせていただきましたが、コンボボックスでのいろいろがよく分かり、大変参考になりました。

もっともっと色々本を読んだりして研究します。
今後ともよろしくお願いいたします。

お礼日時:2007/01/22 09:04

>ついでで申し訳ないのですが、確かこのドロップダウンリストに表示させる順番も変えれたような記憶があるのですが・・・。



できましたっけ・・・
私は知らないでの、別の方法としては、セットしているアイテム自体
を並び替えるとか・・・
    • good
    • 0

こんにちは。



NETは扱ったことないので何なんですが、
VBAでは表示行をコントロールするプロパティがありますので
親玉のVBにないはずはないですね。

VBAでは、ListRowsプロパティです。

それから最大何行表示できるか、ということはあまり意味のないことだと考えます。
何故なら・・・・・・・・・・・・。(^^;;;

以上です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
この問題は#2の方の回答で解決ですが、今ひとつ欲が出て・・・・。
(すみません)

>それから最大何行表示できるか、ということはあまり意味のないことだと考えます。

私の場合、意味はあります。
現在デフォルトで表示は8行、データは12行分あるとすると毎回スクロールさせる必要がありますね。(順番を変えなければ)
でも今回みたいに可変であったり最大15とか決められればそれなりに考えることもできますので・・・。
この例で「最大10行」といわれたら意味ないですけどね。

ありがとうございました。

お礼日時:2007/01/19 08:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報