データ連結式から参照できるのは、コンテナで公開されているフィールドかメソッドに限られると述べたが、実はもう1つ条件がある。それは、式の結果が文字列で得られることである。もっとも、変換結果がどうであれ、あらゆるオブジェクトはToStringメソッドで文字列に変換できるため問題になることはない。
このように連結結果を文字列で出力するデータ連結を「単一値データ連結」と呼ぶが、データ連結にはもう1つ、値の集合をコントロールのデータソースに連結する「反復値データ連結」というものもある。反復値データ連結は、マルチレコード・コントロールに値を設定するために利用されるデータ連結である。
■マルチレコード・コントロールとデータソース
asp:ListBoxコントロールやasp:CheckBoxListコントロールのように、アイテムを複数登録して利用するコントロールは「マルチレコード・コントロール」と呼ばれている。この種のコントロールに値を設定するには、asp:ListItemコントロールを列挙する方法と、Addメソッドを呼び出す方法があることを前回解説したが、第3の方法がここで解説する反復値データ連結である。
反復値データ連結を使って、4種類のマルチレコード・コントロールにアイテムを設定するサンプル・プログラムをリスト9.4に示す。
<%@ PAGE LANGUAGE="C#" %>
<html>
<head>
<script runat="server">
void Page_Load(object sender, EventArgs e) {
DataBind();
}
</script>
</head>
<body>
<form runat="server">
<table><tr>
<td>
<asp:CheckBoxList id="checkboxlist"
DataSource="<%# Request.Headers %>" runat="server" />
</td><td>
<asp:RadioButtonList id="radiobuttonlist"
DataSource="<%# Request.Headers %>" runat="server" />
</td><td>
<asp:DropDownList id="dropdownlist"
DataSource="<%# Request.Headers %>" runat="server" />
</td><td>
<asp:ListBox id="listbox"
DataSource="<%# Request.Headers %>" runat="server" />
</td></tr></table>
<asp:Button Text="Submit" runat="server" />
</form>
</body>
</html>
このプログラムでは、PageクラスのRequest.HeadersフィールドをDataSource属性値として与え、データ連結を行っている。書式だけを見れば特別な処理は行われていないように見えるが、Request.Headersフィールドはstring型ではなく、NameValueCollection型のコレクション・オブジェクトである。従って、もし単一値データ連結を行えば、コレクションの要素がすべて連結された1つの文字列に変換されるはずだが、この場合そうはならない。コントロールの「データソース」であるDataSource属性にデータ連結する場合には、反復値データ連結と呼ばれる特殊なデータ連結が行われるからだ(図9.4)。その結果、コレクションの要素が各コントロールのアイテムとして自動的に登録される。
反復値データ連結が行われると、コレクションに格納された個々の要素が1つずつ取り出され、自動的にコントロールのアイテムとしてまとめて登録される。つまり、
DataSource="<%# <連結式> %>"
という記述には、単純にDataSource属性に何らかの文字列を設定するのではなく、コントロールに要素の集合を設定するという見た目以上の意味が込められているのである。
このような反復値データ連結を行うには、2つの条件を満たす必要がある。1つはデータの連結先がコントロールのデータソースであること、そしてもう1つは連結するデータがIEnumerable、ICollection、IListSourceインターフェイスのいずれかを実装していることである。従って具体的には、データソースを持つ7種類のサーバ・コントロール(asp:CheckBoxList、asp:DropDownList、asp:ListBox、asp:RadioButtonList、asp:DataList、asp:DataGrid、asp:Repeater)をページに配置し、そのDataSource属性に対して次の表9.1に示すクラスのオブジェクトをデータ連結したときに反復値データ連結が行われる。
クラス | 格納する情報 |
---|---|
Array | 配列 |
ArrayList | 可変長配列 |
DataView | テーブルへのビュー |
Hashtable | 連想配列 |
各種コレクション・クラス | コレクション |
表9.1 反復値データ連結のデータソースとして指定可能なクラス |
Copyright© Digital Advantage Corp. All Rights Reserved.