【.NET】コンボボックスに表示する文字列と実際の値(内部的なID、コード、キーなど)とをうまく対応させる その1
VB.NETやC#でコンボボックスに項目を設定する場合、アイテムが単なる文字列であれば、
'VB.NET comboBox1.Items.Add("リンゴ") comboBox1.Items.Add("みかん") '…(略)…
//C# comboBox1.Items.Add("リンゴ"); comboBox1.Items.Add("みかん"); //…(略)…
などと記述します。
ところが、画面上で表示する文字列とは別に、プログラム内ではそのアイテムが対応する実際の値を持っていたいことがあります。
たとえば、下表のように、データベース上で、IDと表示名称を別に管理していることは、普通にあります。
ID | 表示名称 |
---|---|
001 | リンゴ |
002 | みかん |
003 | メロン |
004 | ぶどう |
こういう場合、プログラムでどのように扱えば、コーディングが簡単に済むかを考えます。
(なお、コンボボックスを例に説明しますが、リストボックスでも同様の方法が使えます。)
いろいろな方法が考えられますが、まずToString()メソッドのオーバーライドを利用する方法を紹介します。
方法1:項目のToString()が表示されることを利用する
コンボボックスのアイテムとして追加できるのは文字列だけではありません。実は、ComboBox.Items.Add()の引数はSystem.Objectです。
つまり何でも追加できてしまいます。
ためしにSystem.Drawing.Bitmap型の変数でも入れてみましょう。
'VB.NET 'コンボボックスのアイテムとしてビットマップを追加 comboBox1.Items.Add(New System.Drawing.Bitmap(100, 100))
//C# //コンボボックスのアイテムとしてビットマップを追加 comboBox1.Items.Add(new System.Drawing.Bitmap(100, 100));
このようなコードを実行すると下図のようになります。
ここに表示されているのは何でしょうか?
実はコンボボックスには選択項目のオブジェクトのToString()メソッドの結果が表示されているのです。
(ToString()はSystem.Objectから継承されてすべての型が持つメソッドです。そのオブジェクトを文字列で表現すると何になるかが定義されています。)
以下の例では、このことを利用します。
プロジェクトを作成
まず、Visual Studioでプロジェクトを作成します。
Form1のデザインを開き、コンボボックス1つと、ラベル2つを配置します。
コンボボックスの名前:comboFruit
一つ目のラベルの名前:idTitle
二つ目のラベルの名前:selectedId
コンボボックスのDropDownStyleプロパティは、DropDownListを選び、リストの選択だけできるように(自由なテキストの入力ができなくなる)します。
また、二つ目のラベルのTextプロパティには「選択されていません。」という文字列を入力してあります。
ユーザーがドロップダウンを選択すると、二つ目のラベル(selectedId)にIDを表示します。
ToString()をオーバーライドしたクラスを用意する
MyComboBoxItemというクラスを定義します。
IDと表示名称に、それぞれ対応するプロパティを持ち、さらにToString()をオーバーライドし独自に定義したクラスです。
ToString()は、コンボボックスには、表示名称だけを表示することとして、とりあえず、m_nameをそのまま返しています。
'VB.NETのサンプル 'コンボボックスに追加する項目となるクラス Public Class MyComboBoxItem Private m_id As String = "" Private m_name As String = "" 'コンストラクタ Public Sub New(ByVal id As String, ByVal name As String) m_id = id m_name = name End Sub '実際の値 Public ReadOnly Property Id() As String Get Return m_id End Get End Property '表示名称 '(このプロパティはこのサンプルでは使わないのでなくても良い) Public ReadOnly Property Name() As String Get Return m_name End Get End Property 'オーバーライドしたメソッド 'これがコンボボックスに表示される Public Overrides Function ToString() As String Return m_name End Function End Class
//C#のサンプル //コンボボックスに追加する項目となるクラス public class MyComboBoxItem { private string m_id = ""; private string m_name = ""; //コンストラクタ public MyComboBoxItem(string id, string name) { m_id = id; m_name = name; } //実際の値 public string Id { get { return m_id; } } //表示名称 //(このプロパティはこのサンプルでは使わないのでなくても良い) public string Name { get { return m_name; } } //オーバーライドしたメソッド //これがコンボボックスに表示される public override string ToString() { return m_name; } }
コンボボックスにアイテムを追加する
Loadイベントでコンボボックスに独自のMyComboBoxItemクラスのオブジェクトを追加してみます。
(もちろん、実用的なプログラムを作るときは、LoadイベントでなくともOKです。必要なタイミングで追加します。)
'VB.NETのサンプル Private Sub Form1_Load _ (ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles MyBase.Load '項目をコンボボックスに追加していく Dim item As MyComboBoxItem item = New MyComboBoxItem("001", "リンゴ") comboFruit.Items.Add(item) item = New MyComboBoxItem("002", "みかん") comboFruit.Items.Add(item) item = New MyComboBoxItem("003", "メロン") comboFruit.Items.Add(item) item = New MyComboBoxItem("004", "ぶどう") comboFruit.Items.Add(item) End Sub
//C#のサンプル private void Form1_Load(object sender, EventArgs e) { //項目をコンボボックスに追加していく MyComboBoxItem item; item = new MyComboBoxItem("001", "リンゴ"); comboFruit.Items.Add(item); item = new MyComboBoxItem("002", "みかん"); comboFruit.Items.Add(item); item = new MyComboBoxItem("003", "メロン"); comboFruit.Items.Add(item); item = new MyComboBoxItem("004", "ぶどう"); comboFruit.Items.Add(item); }
選択されたアイテムのIDを取得
最後に、実際にコンボボックスのアイテムが選択されたときのイベントを書きます。
コンボボックスのSelectedIndexChangedイベントを追加します。
'VB.NETのサンプル Private Sub comboFruit_SelectedIndexChanged _ (ByVal sender As Object, ByVal e As System.EventArgs) _ Handles comboFruit.SelectedIndexChanged If comboFruit.SelectedIndex <> -1 Then Dim item As MyComboBoxItem 'Load時に追加したオブジェクトの中から選択中のものを取得 item = DirectCast(comboFruit.SelectedItem, MyComboBoxItem) 'Idプロパティをラベルに表示 selectedId.Text = item.Id End If End Sub
//C#のサンプル private void comboFruit_SelectedIndexChanged (object sender, EventArgs e) { if (comboFruit.SelectedIndex != -1) { MyComboBoxItem item; //Load時に追加したオブジェクトの中から選択中のものを取得 item = (MyComboBoxItem)comboFruit.SelectedItem; //Idプロパティをラベルに表示 selectedId.Text = item.Id; } }
ただし、この方法は、プログラム中でコードからアイテムを選択しようと思うと、アイテムをループして探すなり、あらかじめコードと値の対応付けを覚えておくなどの対応が必要で、少々面倒です。その2では、DataSourceを使用する方法をご紹介します。
関連図書
関連記事
TrackBack URL :
Comments (1)
すごい助かりました…。
コメント by たまご — 2013/4/21 日曜日 @ 22:48:32