DropDownListの要素にオブジェクトを割り当てる - ASP.NET

DropDownListの要素にオブジェクトを割り当てる方法を紹介します。

概要

DropDownListにはWindows Formアプリケーションのコンボボックス(参照)とは違い、オブジェクトを直接挿入できません。
DropDownListで要素とクラスのインスタンスとの対応付けをするコードを紹介します。

対応方法

クラスオブジェクトをリストに格納し、リストのインデックス番号をDropDownListの要素のvalueに設定することで、DropDownListのItemとクラスオブジェクトを対応付けることができます。

サンプルプログラム

ASP.NETアプリケーションを新規作成し、Webフォームを追加します。

UI

下図のUIを作成します。DropDownList, Button, Label を1つずつ配置します。

コード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace DropDownListDemo
{
  public partial class ClassItem : System.Web.UI.Page
  {
    List<MyItem> ItemList = new List<MyItem>();

    protected void Page_Load(object sender, EventArgs e)
    {
      MyItem m = new MyItem();
      m.id = 101;
      m.Name = "ペンギンクッキー";
      m.Price = 130;
      ItemList.Add(m);

      m = new MyItem();
      m.id = 102;
      m.Name = "しろくまキャンディー";
      m.Price = 40;
      ItemList.Add(m);

      m = new MyItem();
      m.id = 103;
      m.Name = "らくだキャラメル";
      m.Price = 25;
      ItemList.Add(m);

      m = new MyItem();
      m.id = 104;
      m.Name = "くじらケーキ";
      m.Price = 240;
      ItemList.Add(m);

      m = new MyItem();
      m.id = 105;
      m.Name = "ガンガルーポテト";
      m.Price = 180;
      ItemList.Add(m);

      if (IsPostBack == false) {
        for (int i = 0; i < ItemList.Count; i++) {
          ListItem li = new ListItem();
          li.Text = ItemList[i].Name;
          li.Value = Convert.ToString(i);
          DropDownList1.Items.Add(li);
        }
      }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
      int selected = -1;
      if (int.TryParse(DropDownList1.SelectedValue, out selected) == true) {
        Label1.Text = string.Format("{0:d}:{1:s} / Price={2:d} が選択されました。", 
          ItemList[selected].id, ItemList[selected].Name, ItemList[selected].Price);
      }
    }
  }
}

解説

Loadイベント
protected void Page_Load(object sender, EventArgs e)
{
  MyItem m = new MyItem();
  m.id = 101;
  m.Name = "ペンギンクッキー";
  m.Price = 130;
  ItemList.Add(m);

  m = new MyItem();
  m.id = 102;
  m.Name = "しろくまキャンディー";
  m.Price = 40;
  ItemList.Add(m);

  m = new MyItem();
  m.id = 103;
  m.Name = "らくだキャラメル";
  m.Price = 25;
  ItemList.Add(m);

  m = new MyItem();
  m.id = 104;
  m.Name = "くじらケーキ";
  m.Price = 240;
  ItemList.Add(m);

  m = new MyItem();
  m.id = 105;
  m.Name = "ガンガルーポテト";
  m.Price = 180;
  ItemList.Add(m);

  if (IsPostBack == false) {
    for (int i = 0; i < ItemList.Count; i++) {
      ListItem li = new ListItem();
      li.Text = ItemList[i].Name;
      li.Value = Convert.ToString(i);
      DropDownList1.Items.Add(li);
    }
  }
}
前半部分は、MyItemクラスのインスタンスを作成し、情報を設定しItemListリストに追加する処理です。今回の例では5つの要素をリストに追加しています。後半のforループはDroopDownListに要素を追加するコードです。DropDownListはViewStateによってDropDownListの内容や選択項目が保持されるため、IsPostBackプロパティを確認し、ポストバックでない場合のみ要素の追加処理をします。(IsPostBackを確認しない場合の動作についてはこちらを参照)
また、ItemListはViewStateでは保持されないため、ポストバックの有無にかかわらず、毎回リストの構築を実行します。
Button.Clickイベント
protected void Button1_Click(object sender, EventArgs e)
{
  int selected = -1;
  if (int.TryParse(DropDownList1.SelectedValue, out selected) == true) {
    Label1.Text = string.Format("{0:d}:{1:s} / Price={2:d} が選択されました。", 
      ItemList[selected].id, ItemList[selected].Name, ItemList[selected].Price);
  }
}
Button1のClickイベントではDropDownListの選択された要素のvalueを取得します。valueの値はDropDwonListで選択された要素のオブジェクトの位置を示す、ItemListのインデックス番号です。valueの値の位置にあるItemListの要素を取り出し、id, Name, Price の各要素をラベルに表示します。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[Button]をクリックします。ページ遷移しラベルに"101:ペンギンクッキー / Price=130 が選択されました。"のメッセージが表示されます。DropDownListで選択された要素のクラス情報がラベルに表示されています。


ドロップダウンリストを開きます。要素の一覧が表示されます。


別の要素を選択し、[Button]をクリックします。選択した要素のオブジェクト情報がラベルに表示されます。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2014-04-17
iPentec all rights reserverd.