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