リスト・コントロールにアイテムを登録する方法は、前述したasp:ListItemコントロールを記述する方法以外にも、プログラム・コードで追加する方法と、データ連結を利用する方法がある。asp:ListItemコントロールを使わずに登録する方法をとれば、ページ・デザイン時にアイテムを決定する必要がなくなるため、アイテムを動的に設定することが可能になる。なお、データ連結についてはあらためて解説するため、ここではプログラム・コードで設定する方法についてのみ解説する。
リスト系コントロールがすべてListControlクラスのサブクラスとして定義されていることはすでに述べたとおりだが、リスト・コントロールに登録されたアイテムは、このListControlクラスのItemsプロパティに格納されている。そして、ItemsプロパティはListItemオブジェクトのコレクションを格納するListItemCollectionクラスのオブジェクトとして定義されている。従って、アイテムを追加するには、まずListItemオブジェクトを作成し、それをItemsプロパティに追加するという手順になる。例えば、
<asp:ListItem Value="0">Windows XP</asp:ListItem>
と同じアイテムを、コントロールIDに「listbox1」が設定されたリスト・ボックスに追加するには、次のコードを記述する。アイテムの登録には、ListItemCollection.Addメソッドを呼び出して行っている。
listbox1.Items.Add(new ListItem("Windows XP", "0"));
また、次のコンストラクタでValueプロパティを省略してListItemオブジェクトを作成することができる。この場合はValueプロパティにTextプロパティと同じ値が代入される。
listbox1.Items.Add(new ListItem("Windows XP"));
こうして登録されたアイテムの選択状態を設定するには、ListItemクラスのbool型メンバとして定義されているSelectedプロパティに値を設定すればよい。Selectedプロパティの値をtrueに設定すれば、そのアイテムが選択状態で表示される。例えば、先頭のアイテムを選択状態に設定するには、次のコードを記述する。
listbox1.Items[0].Selected = true;
また、次のようにSelectedIndexプロパティに選択アイテムのインデックスを設定しても、同様の処理が可能だ。
listbox1.SelectedIndex = 0;
以上の手順でアイテムを動的に設定するサンプル・プログラムをリスト8.2に示す。このプログラムも前出のリスト8.1(control09.aspx)と同じく、ボタンをクリックすると、選択アイテムのValueプロパティ値をテキスト・ボックスに表示するようになっている。
<%@ PAGE LANGUAGE="C#" %>
<html>
<head>
<script runat="server">
void Page_Load(Object sender, EventArgs e) {
if (!IsPostBack) {
listbox1.Items.Add(new ListItem("Windows XP"));
listbox1.Items.Add(new ListItem("Windows 2000"));
listbox1.Items.Add(new ListItem("Windows Me"));
listbox1.Items.Add(new ListItem("Windows 98"));
listbox1.Items[0].Selected = true;
dropdown1.Items.Add(new ListItem("C#.NET", "0"));
dropdown1.Items.Add(new ListItem("VB.NET", "1"));
dropdown1.Items.Add(new ListItem("JScript.NET", "2"));
dropdown1.Items.Add(new ListItem("C++.NET", "3"));
dropdown1.SelectedIndex = 1;
string[] labels1 = {
"ASP.NET", "ADO.NET", "WebService", "XML" };
foreach (string t in labels1) {
checklist1.Items.Add(new ListItem(t));
}
string[] labels2 = {
"hoge", "foo", "bar", "aho" };
for (int i = 0; i < labels2.Length; i++) {
radiolist1.Items.Add(new ListItem(labels2[i], i.ToString()));
}
} else {
string t = "";
string punc = "";
if (listbox1.SelectedItem != null) {
t += listbox1.SelectedItem.Value;
punc = ", ";
}
t += punc + dropdown1.SelectedItem.Value;
punc = ", ";
t += ", (";
punc = "";
foreach (ListItem v in checklist1.Items) {
if (v.Selected) {
t += punc + v.Value;
punc = ", ";
}
}
t += ")";
if (radiolist1.SelectedItem != null) {
t += ", " + radiolist1.SelectedItem.Value;
}
textbox1.Text = t;
}
}
</script>
</head>
<body>
<form runat="server">
<asp:TextBox id="textbox1" Columns="80" runat="server" />
<br>
<table>
<tr>
<td>asp:ListBox</td>
<td>asp:DropDownList</td>
<td>asp:CheckBoxList</td>
<td>asp:RadioButtonList</td>
</tr>
<tr>
<td>
<asp:ListBox id="listbox1" runat="server" />
</td>
<td>
<asp:DropDownList id="dropdown1" runat="server" />
</td>
<td>
<asp:CheckBoxList id="checklist1" runat="server" />
</td>
<td>
<asp:RadioButtonList id="radiolist1" runat="server" />
</td>
</tr>
</table>
<asp:Button Text="OK" runat="server" />
</form>
</body>
</html>
■選択状態の取得
選択されているアイテムを調べるには、2通りの方法がある。選択されたアイテムを示すSelectedItemプロパティを参照する方法と、Itemsコレクションプロパティに格納されたアイテムのSelectedプロパティを1つずつ調べる方法である。
アイテムを同時に1つしか選択できないリスト・コントロール(asp:ListBox(Singleモード時)、asp:DropDownList、asp:RadioButtonList)ならば、SelectedItemプロパティに格納されている選択アイテムのListItemオブジェクトを取得すればよい。もし、どのアイテムも選択されていなければ、SelectedItemプロパティの値はnullとなっている。ListItemオブジェクトではなく、選択されているアイテムのインデックスを調べたければ、int型のSelectedIndexプロパティを参照すればよい。このプロパティには、0をベースとした選択アイテムのインデックスが格納されている。どのアイテムも未選択であれば、SelectedIndexの値は-1となる。
複数のアイテムを同時に選択できるasp:ListBox(Multipleモード時)やasp:CheckBoxListのリスト・コントロールでは、もう少し面倒な作業になる。このタイプのリスト・コントロールでもSelectedItemプロパティやSelectedIndexプロパティを参照することはできるが、これらのプロパティは最も先頭に近い選択アイテムを示すだけなので、選択されているすべてのアイテムを調べるには、次のようなコードでItemsコレクションに格納されたアイテムのSelectedプロパティを順次調べていかなければならない。
foreach (ListItem item in checklist1.Items) {
if (item.Selected) {
result += punc + item.Text;
punc = ", ";
}
}
各コントロールの選択状態を調べるサンプルはすでにリスト8.1(control09.aspx)とリスト8.2(control10.aspx)に示しているので、そちらを参照して欲しい。
Copyright© Digital Advantage Corp. All Rights Reserved.