Sugi@ぱぱんぶぃびぃ Blog

VBとかVB.NETとかVB2005とか・・・

AILight Banner
AILight Blog

プロフィール

Sugi@ぱぱんぶぃびぃ Blog

目次

Blog 利用状況

記事分類

過去の記事

タグ

Windows.Forms.ComboBoxのItemsコレクションに文字列以外の項目を挿入する

今まで必要には迫られてなかったんで、あまり気にもしてなかったんだけど、
VB6でいうところのItemDataプロパティみたいなのができないかと調べていたら...
よく考えたらItems.Addでコレクションに追加できるItemってObject型だった!

実体のComboBoxへはIConvertibleインターフェースのToStringメソッドで求めた文字列をSendMessageしてるみたいなのでとりあえず、

  1. 自前クラスを作成し、IConvertibleインターフェースを実装。
  2. 自前クラスではIConvertibleインターフェースのToStringメソッドにてComboBoxに表示させる文字列を返すように記述。

という手順で無事解決したのでした。(ってこれってアリなんだろうか?)

投稿日時 : 2004年3月12日 13:55


コメントを追加

#  re: Windows.Forms.ComboBoxのItemsコレクションに文字列以外の項目を挿入する 2004年3月12日 14:29 石野 光仁

面白い方法ですね。
でも オブジェクトの中に入っているものと
ToString()で表示されるものが変化するのは
微妙な感じがします。

といっても他にいい方法も見つからず、
コントロールを作るか、コンボを制御するクラスを
作るかなんですよね。

第三の方法として、シンプルで、コーディングも
綺麗なのはsugiさんの方法ですね。
素晴らしいと思います。

ただ、感覚的に何かがひっかかりますので、
もう少し考えて見ます。

#  re: Windows.Forms.ComboBoxのItemsコレクションに文字列以外の項目を挿入する 2004年3月12日 14:37 Sugi@ぱぱんぶぃびぃ

> ToString()で表示されるものが変化するのは
> 微妙な感じがします。
礼儀作法としては、
クラスのコンストラクタにてComboBoxへ挿入する文字列をセットする
クラスのTextプロパティ、ToStringメソッドはComboBoxで表示される文字列を返す
ってとこでしょうか?

#  re: Windows.Forms.ComboBoxのItemsコレクションに文字列以外の項目を挿入する 2004年3月12日 16:51 菊池

#IConvertibleに限定されましたっけ?
#Object.ToStringをオーバライドするだけでよかった気が

んー、これで正しいと思うけどなぁ。

 ComboBoxは 文字列しか表示できないから ToStringの結果を表示する。
 それだけの事だと思うけど。
 逆に、ToStringを実装してるものであれば、基本的にComboBoxに入れる事ができるんでしょう。
 クラスを作ってToStringを作らないってのは文字列にできない、故に、コンボボックスに表示できない、でもあるか。

 ComboBoxに表示する文字列を取る為に IGetComboTextなんてのを実装しろなんていわれたら泣いちゃう。(違う所では違う表示が要求されるわけでしょ)

#  re: Windows.Forms.ComboBoxのItemsコレクションに文字列以外の項目を挿入する 2004年3月12日 18:01 Sugi@ぱぱんぶぃびぃ

#IConvertibleに限定されましたっけ?
#Object.ToStringをオーバライドするだけでよかった気が

あ、ほんとだ!
じゃ、もっとシンプルになりますね。

#  re: Windows.Forms.ComboBoxのItemsコレクションに文字列以外の項目を挿入する 2004年3月14日 13:00 渋木宏明(ひどり)

面白そうな話してたのに、もう終わってる (T_T)

#  re: Windows.Forms.ComboBoxのItemsコレクションに文字列以外の項目を挿入する 2004年3月15日 1:35 よねKEN

ども、よねKENです。これ便利ですよね。
DBからデータを取ってきて表示する場合、
コードと名称の組でデータを扱うことが多いので、
CodeとNameプロパティを持ったListItemクラスを作って使ってます。
基本的にはToStringの実装内容でカバーしますが、
ComboBox/ListBoxのDisplayMemberも併用しています。

#  re: Windows.Forms.ComboBoxのItemsコレクションに文字列以外の項目を挿入する 2004年3月15日 10:34 Sugi@ぱぱんぶぃびぃ

これ、やってて気づいたけど、
追加のみの場合しか、使えないんですよね。
たとえば、
独自のMyListItemクラスを作成して、Textプロパティを
ComboBoxに表示される文字列を返すようにしたとして、
以下のようなコード
CType(ComboBox1.Items(0), MyListItem).Text = "変更された文字列"
は当然アリなわけですが、
この場合、ComboBox自体への通知は行われないため、
ComboBoxのリストの見た目は変更されない。
しかしItemsコレクションへのアクセス(例えばSelectedItemプロパティ)
を行った場合はObjectCollectionから値を返すしているため、
見た目と値が違うというヘンテコリンな状態になります。
汎用性というか安全性を考えると、
やっぱりComboBoxを継承したコントロールにしてObjectCollectionへは
内部で受け渡すようにしてしまうべきかと。

#  re: Windows.Forms.ComboBoxのItemsコレクションに文字列以外の項目を挿入する 2004年3月15日 13:06 菊池

んーと、IBindingListのListChangedやSupportsChangeNotification の辺りを確認されたし。

プロパティ変更通知に関する実装がされてないためだと思います。

#  re: Windows.Forms.ComboBoxのItemsコレクションに文字列以外の項目を挿入する 2004年3月15日 15:49 Sugi@ぱぱんぶぃびぃ

>プロパティ変更通知に関する実装がされてないため
すみません、私の書き方が悪かったようで、
IBindingListまでは必要ないにしても、そのような
内部通知(イベント)を行えばよいという意味合いで
書いたつもりでした。m(__)m

#  re: Windows.Forms.ComboBoxのItemsコレクションに文字列以外の項目を挿入する 2007年7月9日 16:03 @@@@

オブジェクト型のItems,
メソッド型のItems,
プロパティ方のItems,
他にありますか?
どう違うのですか?
タイトル
名前
URL
コメント