Web フォーム コントロールの識別

更新 : 2007 年 11 月

ASP.NET Web ページのすべてのコントロールは一意に識別する必要があります。通常は、一意に識別するための値をコントロールの ID プロパティに割り当てます。この値が、コントロールのインスタンス名、つまりコード内でコントロールを参照するための名前になります。たとえば、TextBox コントロールの ID プロパティを Text1 に設定すると、コード内でコントロールを Text1 として参照できます。

DataListRepeaterGridViewFormView、および DetailsView の各コントロールを含む多くのデータ バインド コントロールは、他の子コントロールのコンテナになります。これらのコントロールは、実行されると子コントロールの複数のインスタンスを生成します。たとえば、Label コントロールを含む DataList テンプレートを作成してページを実行すると、DataList コントロールのデータ ソース内のレコードと同じ数だけ Label コントロールのインスタンスがページ内に生成されます。

1d04y8ss.alert_note(ja-jp,VS.90).gifメモ :

DataList コントロール、Repeater コントロールなどのテンプレートを使用するコントロールは、テンプレート オブジェクトをホストします。たとえば、DataList コントロールを実行すると、DataListItem クラスの複数のインスタンスが作成されます。これらのテンプレート オブジェクトは、ラベル、テキスト ボックス、ボタンなどの個別のコントロールを含みます。

1 つのページでコントロールを複数回インスタンス化でき、また、同じコントロール名を別のページで再使用できるため、ASP.NET Page Framework には、ページ内およびアプリケーション内で各コントロールの識別子が一意になることを保証する機構が用意されています。さらに ASP.NET Page Framework には、コード内でコントロールを操作できるように、個々のコントロールを識別するための機能も用意されています。

名前付けコンテナ

他のコントロールのコンテナとして動作するコントロールは、子コントロールの名前付けコンテナ、つまり ID 名前空間を生成します。この名前付けコンテナを提供することで、コントロールは子コントロールの ID 属性がアプリケーション全体にわたって一意であることを保証できます。コントロールは、INamingContainer インターフェイスを実装することで名前付けコンテナを生成します。子コントロールが実行時に生成されると、名前付けコンテナは子コントロールの ID プロパティと結合され、UniqueID プロパティの値を生成します。したがって、UniqueID プロパティは、名前付けコンテナとコントロールの個別の ID 値を参照して、コントロールの完全修飾識別子となります。

上の例では、親 DataList コントロールの名前付けコンテナ (つまり名前空間) の内部で Label コントロールの複数のインスタンスが作成されます。各 Label コントロールの UniqueID プロパティはこの名前空間を反映し、 DataList1:_ctl:MyLabel、DataList1:_ct2:MyLabel などの形式になります。

1d04y8ss.alert_note(ja-jp,VS.90).gifメモ :

生成された UniqueID プロパティの値を使用してコントロールを参照するコードは記述しないでください。UniqueID プロパティは、ハンドルとして扱う (たとえばプロセスに渡す) ことはできますが、このプロパティの特殊な構造には依存しないでください。

それぞれのコンテナ コントロールが子コントロールの名前付けコンテナを提供する一方で、ページ自体もそのすべての子コントロールに名前付けコンテナを提供します。これにより、対象ページ上のすべてのコントロールに、アプリケーション内で一意な名前空間が作成されます。

NamingContainer プロパティの使用

子コントロールは、NamingContainer プロパティを使用してその名前付けコンテナを参照できます。このプロパティは、Control 型のオブジェクトを返します。このオブジェクトは適切な DataList コントロールや DataListItem オブジェクトなどにキャストできます。

名前付けコンテナの参照は、子コントロールからコンテナ コントロールのプロパティにアクセスする必要がある場合に便利です。たとえば、子コントロールの DataBinding イベントのハンドラで、名前付けコンテナから DataItem オブジェクトを取得してアクセスできます。

1d04y8ss.alert_note(ja-jp,VS.90).gifメモ :

NamingContainer プロパティは、必ずしも Parent プロパティと同じコントロールを参照する必要はありません。たとえば Repeater コントロールに、Label コントロールがあるテーブルを含む項目テンプレートがあるとします。ラベルの親コントロールはテーブル セル (たとえば HtmlTableCell オブジェクト) ですが、その名前付けコンテナは DataListItem オブジェクトです。これは、Label コントロールの名前空間を定義するのがテーブルではなく DataListItem であるためです。

コントロールの参照

DataListRepeaterGridView の各コントロールのテンプレートのように、実行時に生成されるコントロールがページに含まれている場合は、ID が一意にならないため、コントロールを ID で直接参照することはできません。しかし、ページ内の個々のコントロールを検出する方法はいくつかあります。詳細については、「プログラムによる ASP.NET コントロールへのアクセス」を参照してください。

参照

概念

Web フォーム コントロール ID の解決