システム開発・Webサイト構築 プラスラス

2008/1/14 月曜日

【.NET】コンボボックスに表示する文字列と実際の値(内部的なID、コード、キーなど)とをうまく対応させる その1

このエントリーを含むはてなブックマーク Yahoo!ブックマークに登録 Google ブックマーク del.icio.us

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を使用する方法をご紹介します。

関連図書

ずばりわかる!VB&C#―プログラミングの基礎はこれで万全 (日経BPパソコンベストムック) 速効解決!逆引きハンドブック Visual Basic―2005対応 (テクニカルTipsシリーズ) 速効解決!逆引きハンドブックVisual C# (テクニカルTipsシリーズ)

関連記事

Filed under: C#,Programming,VB.NET — Nakai @ 10:50:53

1件のコメント »

  1. すごい助かりました…。

    コメント by たまご — 2013/4/21 日曜日 @ 22:48:32

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする

HTML convert time: 0.824 sec. Powered by WordPress