Web フォーム コントロール ID の解決
更新 : 2007 年 11 月
プログラムによってコントロールにアクセスできるように Web サーバー コントロールの ID 属性を宣言すると、ASP.NET ページ フレームワークは宣言した ID が ASP.NET Web アプリケーション全体で自動的に一意になるようにします。
名前付けコンテナ
ASP.NET Page Framework は、INamingContainer インターフェイスを使用してアプリケーションに自動 ID 解決機能を提供します。このインターフェイスは、実装する各クラスに対して名前付けコンテナを生成します。名前付けコンテナは、ASP.NET Web ページのコントロール階層に新しい ID 名前空間を定義します。この名前付けコンテナによって、ページ フレームワークは名前空間で生成された各 Control オブジェクトの UniqueID プロパティに対する値を生成できます。UniqueID プロパティは、コントロールに対する完全修飾識別子であるという点でそこで宣言する ID プロパティと異なります。
INamingContainer を実装するクラスとしては、Page、DataList、GridView、DataListItem、DataGridItem、Repeater などがあります。一般に、子コントロールを作成できるコントロールは動的に INamingContainer を実装します。
Page クラスは、ページのコントロール階層のトップ レベルの名前付けコンテナとして機能します。
データ バインディング シナリオにおける名前解決
ページ フレームワークが提供する自動名前付け機能は、データ バインディングのシナリオで重要になります。ページで宣言されているコントロールを表示する次のような例を考えます。
<asp:Repeater id="MyDataList" runat="server">
<ItemTemplate>
<asp:Label id="MyLabel" Text="<%# Container.ToString() %>" runat="server"/><br />
</ItemTemplate>
</asp:Repeater>
<hr />
<asp:Label id="ResultsLabel" runat="server" AssociatedControlID="MyDataList"/>
<asp:Repeater id="MyDataList" runat="server">
<ItemTemplate>
<asp:Label id="MyLabel" Text="<%# Container.ToString() %>" runat="server"/><br />
</ItemTemplate>
</asp:Repeater>
<hr />
<asp:Label id="ResultsLabel" runat="server" AssociatedControlID="MyDataList"/>
Label コントロールがデータ ソースにバインドされ、Repeater コントロールがそのデータ ソースの項目を反復処理する場合、各インスタンスに ID MyLabel だけを割り当てている場合も含めて、ページは Label コントロールの複数のインスタンスをプログラムによって区別する必要があります。ページ フレームワークは、各コントロールに完全修飾の UniqueID プロパティを使用してこれを解決します。たとえば、次のコードは Label コントロールの 3 つのバージョンを生成し、UniqueID プロパティ値をページに書き込みます。
<script language="vb" runat="server">
Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
Dim sb As New StringBuilder()
sb.Append("Container: " + _
MyDataList.NamingContainer.ToString() + "<p>")
Dim a As New ArrayList()
a.Add("A")
a.Add("B")
a.Add("C")
MyDataList.DataSource = a
MyDataList.DataBind()
Dim i As Integer
Dim l As Label
For i = 0 To MyDataList.Controls.Count - 1
l = CType(CType(MyDataList.Controls(i), RepeaterItem).FindControl("MyLabel"), Label)
sb.Append("Container: " & _
CType(MyDataList.Controls(i), RepeaterItem).NamingContainer.ToString() & _
"<p>")
sb.Append("<b>" & l.UniqueID.ToString() & "</b><p>")
Next
ResultsLabel.Text = sb.ToString()
End Sub
</script>
<script language="c#" runat="server">
void Page_Load(Object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
sb.Append("Container: " +
MyDataList.NamingContainer.ToString() + "<p>");
ArrayList a = new ArrayList();
a.Add("A");
a.Add("B");
a.Add("C");
MyDataList.DataSource = a;
MyDataList.DataBind();
for (int i = 0; i < MyDataList.Controls.Count; i++)
{
Label l =
(Label)((RepeaterItem)MyDataList.Controls[i]).FindControl("MyLabel");
sb.Append("Container: " +
((RepeaterItem)MyDataList.Controls[i]).NamingContainer.ToString() +
"<p>");
sb.Append("<b>" + l.UniqueID + "</b><p>");
}
ResultsLabel.Text = sb.ToString();
}
</script>
このページを要求すると、次の内容がページに書き込まれます。
MyDataList という Repeater コントロールの名前付けコンテナ。この名前付けコンテナは、.aspx ファイルの名前に依存します。
メモ : この例の .aspx ファイルが MySample1.aspx の場合、名前付けコンテナのクラスは ASP.mysample1_aspx になりますが、名前付けコンテナは Page になります。
名前付けコンテナとして機能する次のコントロールのインスタンス (つまり、Repeater コントロール)。このコンテナ名は、名前空間修飾子全体と共に表示されます。
Repeater コントロール内の各 Label コントロールの UniqueID プロパティ。
メモ : 生成された UniqueID プロパティの値を使用してコントロールを参照するコードは記述しないでください。UniqueID プロパティは、ハンドルとして扱う (たとえばプロセスに渡す) ことはできますが、この構造のプロパティには依存しないでください。
参照
処理手順
方法 : ASP.NET Web ページの ID による子コントロールの検索
方法 : Web サーバー コントロールの名前付けコンテナのメンバにアクセスする