ASP.NETの小技、今回はユーザーコントロールの動的生成の方法だ。もととなるのは、「新館」の方で、写真表示に特化したユーザーコントロールを作りたい、ということだ。それなら作ればいいじゃないかと思うのだが、静的なページではなくデータベースと絡めて動的に表示したいので、できればページのロード時に必要な分だけ生成させたい。
ということで、ユーザーコントロールの動的生成に取り組んだ。ここは、ちょっとした備忘録だ。
動的にユーザーコントロールを生成すると言っても、ユーザーコントロール側ですることは少ない。必要なのはまず、
<%@ Control Language="C#" ClassName="PhotoControl" %>
というように@タグのClassName属性にクラス名を定義することだ。このクラス名を用いて、動的なユーザーコントロールオブジェクトを作ることになる。この場合、PhotoControlがクラス名となる。
あとは、ユーザーコントロールを使いたい場所で、new演算子を用いてオブジェクトを作成し、PlaceHolderなどのコンテンツホルダにオブジェクトを加えていけばよい。と言いたいところだが、このようにすると必ず失敗する(実行時にエラーとなる)。
PhotoControl uc = new PhotoControl("photo.ascx");
PlaceHolder1.Controls.Add(uc);
どうやら、ユーザーコントロールは他の表樹陰的なWebコントロールとは異なった初期化が必要なようだ。調べてみると、PageクラスのLoadControl()メソッドを使ってオブジェクトを生成する必要があると言うことだ。
PhotoControl uc = (PhotoControl)Page.LoadControl("photo.ascx");
PlaceHolder1.Controls.Add(uc);
これだとうまくいく。もちろん、ユーザーコントロールオブジェクトの生成後に、ユーザーコントロールに適切なプロパティなどを設定してやる必要はあるが。
ちなみに、PhotoControl自体の中身については本筋ではないので省略するが、ある程度仕様が固まった時点で、軽く紹介してみたいと思っている。