Web フォーム コントロールの識別
更新 : 2007 年 11 月
ASP.NET Web ページのすべてのコントロールは一意に識別する必要があります。通常は、一意に識別するための値をコントロールの ID プロパティに割り当てます。この値が、コントロールのインスタンス名、つまりコード内でコントロールを参照するための名前になります。たとえば、TextBox コントロールの ID プロパティを Text1 に設定すると、コード内でコントロールを Text1 として参照できます。
DataList、Repeater、GridView、FormView、および DetailsView の各コントロールを含む多くのデータ バインド コントロールは、他の子コントロールのコンテナになります。これらのコントロールは、実行されると子コントロールの複数のインスタンスを生成します。たとえば、Label コントロールを含む DataList テンプレートを作成してページを実行すると、DataList コントロールのデータ ソース内のレコードと同じ数だけ Label コントロールのインスタンスがページ内に生成されます。
メモ : |
---|
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 などの形式になります。
メモ : |
---|
生成された UniqueID プロパティの値を使用してコントロールを参照するコードは記述しないでください。UniqueID プロパティは、ハンドルとして扱う (たとえばプロセスに渡す) ことはできますが、このプロパティの特殊な構造には依存しないでください。 |
それぞれのコンテナ コントロールが子コントロールの名前付けコンテナを提供する一方で、ページ自体もそのすべての子コントロールに名前付けコンテナを提供します。これにより、対象ページ上のすべてのコントロールに、アプリケーション内で一意な名前空間が作成されます。
NamingContainer プロパティの使用
子コントロールは、NamingContainer プロパティを使用してその名前付けコンテナを参照できます。このプロパティは、Control 型のオブジェクトを返します。このオブジェクトは適切な DataList コントロールや DataListItem オブジェクトなどにキャストできます。
名前付けコンテナの参照は、子コントロールからコンテナ コントロールのプロパティにアクセスする必要がある場合に便利です。たとえば、子コントロールの DataBinding イベントのハンドラで、名前付けコンテナから DataItem オブジェクトを取得してアクセスできます。
メモ : |
---|
NamingContainer プロパティは、必ずしも Parent プロパティと同じコントロールを参照する必要はありません。たとえば Repeater コントロールに、Label コントロールがあるテーブルを含む項目テンプレートがあるとします。ラベルの親コントロールはテーブル セル (たとえば HtmlTableCell オブジェクト) ですが、その名前付けコンテナは DataListItem オブジェクトです。これは、Label コントロールの名前空間を定義するのがテーブルではなく DataListItem であるためです。 |
コントロールの参照
DataList、Repeater、GridView の各コントロールのテンプレートのように、実行時に生成されるコントロールがページに含まれている場合は、ID が一意にならないため、コントロールを ID で直接参照することはできません。しかし、ページ内の個々のコントロールを検出する方法はいくつかあります。詳細については、「プログラムによる ASP.NET コントロールへのアクセス」を参照してください。