方法 : Web サーバー コントロールの名前付けコンテナのメンバにアクセスする
更新 : 2007 年 11 月
コントロールの名前付けコンテナのプロパティやメソッドにアクセスすることが必要になる場合があります。たとえば、データ バインディングの場合、名前付けコンテナはコントロールがバインドされているデータを含む DataItem プロパティを使用できるようにします。コンテナであるコントロールには、コンテキストに応じて異なる方法でアクセスできます。
データ連結式から名前付けコンテナにアクセスするには
データ バインディング式で、コンテナへの参照を返す Container キーワードを使用します。次に、コンテナのプロパティまたはメソッドにアクセスします。
このキーワードは、名前付けコンテナの DataItem オブジェクトから値を取得するために Eval メソッドで使用することが一般的ですが、このメソッド以外でも使用できます。DataList、Repeater、GridView の各コントロールのテンプレートに含まれる Label コントロールの例を次に示します。現在の項目番号の次に、名前付けコンテナの現在の Title データ項目が表示されます。
<asp:Label ID="Label1" runat="server"> <%# Container.DataItemIndex + 1 %>. <%# Eval("Title") %> </asp:Label>
<asp:Label ID="Label1" runat="server"> <%# Container.DataItemIndex + 1 %>. <%# Eval("Title") %> </asp:Label>
次の例は上の例に似ていますが、名前付けコンテナの DataItem オブジェクトから値 (Author 項目) を取得します。
<asp:Label ID="Label2" runat="server" > <%# DataBinder.Eval(Container.DataItem, "Author") %> </asp:Label>
<asp:Label ID="Label2" runat="server" > <%# DataBinder.Eval(Container.DataItem, "Author") %> </asp:Label>
メモ : NamingContainer プロパティは、必ずしも Parent プロパティと同じコントロールを参照する必要はありません。たとえば Repeater コントロールに、Label コントロールがあるテーブルを含む項目テンプレートがあるとします。ラベルの親コントロールはテーブル セル (たとえば HtmlTableCell オブジェクト) ですが、その名前付けコンテナは DataListItem オブジェクトです。これは、Label コントロールの名前空間を定義するのがテーブルではなく DataListItem であるためです。
上記の構文を使用してプロパティ値を取得する完全な例を次に示します。
<%@ Page Language="VB" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Naming Container Example</title> </head> <body> <form id="form1" runat="server"> <div> <asp:XmlDataSource ID="XmlDataSource1" runat="server" XPath="Books/LanguageBooks/Book"> <Data> <Books> <LanguageBooks> <Book Title="Pure JavaScript" Author="Wyke, Gilliam, and Ting"/> <Book Title="Effective C++ Second Edition" Author="Scott Meyers"/> <Book Title="Assembly Language Step-By-Step" Author="Jeff Duntemann"/> <Book Title="Oracle PL/SQL" Author="Steven Feuerstein"/> </LanguageBooks> <SecurityBooks> <Book Title="Counter Hack" Author="Ed Skoudis"/> </SecurityBooks> </Books> </Data> </asp:XmlDataSource> <asp:GridView ID="GridView1" runat="server" DataSourceID="XmlDataSource1" AutoGenerateColumns="False"> <Columns> <asp:TemplateField HeaderText="Title" > <ItemTemplate> <asp:Label ID="Label1" runat="server"> <%# Container.DataItemIndex + 1 %>. <%# Eval("Title") %> </asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Author"> <ItemTemplate> <asp:Label ID="Label2" runat="server" > <%# DataBinder.Eval(Container.DataItem, "Author") %> </asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </div> </form> </body> </html>
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Naming Container Example</title> </head> <body> <form id="form1" runat="server"> <div> <asp:XmlDataSource ID="XmlDataSource1" runat="server" XPath="Books/LanguageBooks/Book"> <Data> <Books> <LanguageBooks> <Book Title="Pure JavaScript" Author="Wyke, Gilliam, and Ting"/> <Book Title="Effective C++ Second Edition" Author="Scott Meyers"/> <Book Title="Assembly Language Step-By-Step" Author="Jeff Duntemann"/> <Book Title="Oracle PL/SQL" Author="Steven Feuerstein"/> </LanguageBooks> <SecurityBooks> <Book Title="Counter Hack" Author="Ed Skoudis"/> </SecurityBooks> </Books> </Data> </asp:XmlDataSource> <asp:GridView ID="GridView1" runat="server" DataSourceID="XmlDataSource1" AutoGenerateColumns="False"> <Columns> <asp:TemplateField HeaderText="Title" > <ItemTemplate> <asp:Label ID="Label1" runat="server"> <%# Container.DataItemIndex + 1 %>. <%# Eval("Title") %> </asp:Label> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Author"> <ItemTemplate> <asp:Label ID="Label2" runat="server" > <%# DataBinder.Eval(Container.DataItem, "Author") %> </asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> </div> </form> </body> </html>
コードから名前付けコンテナにアクセスするには
コントロールの NamingContainer プロパティを取得し、それをコンテナのクラスの型 (たとえば GridViewRow) にキャストします。
例については、「NamingContainer プロパティによるコントロールの名前付けコンテナの指定」を参照してください。