LoadControlでユーザーコントロールを動的に生成する
C#やVB.NETコード上でコントロールを動的に生成し、ページ上に表示する場合、通常のサーバーコントロールの動的生成であれば
TextBox t = new TextBox();
PlaceHolder1.Controls.Add(t);
などとすれば出来ますが、ユーザーコントロール(ascx)の場合はnewではなく、LoadControlメソッドを使用するのが一番いいようです。newでも作れるけど、コントロールの初期化を正常に行うためにいろいろ面倒みたいで。
今回は以下のような単純なユーザーコントロールを例にしてみます。ラベルとテキストボックスを配置し、ユーザーコントロールのプロパティとしてそれらの値を外部から取得/設定できるものです。
これを動的に生成するにはこんな感じで…
public partial class test_Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //静的に配置した場合 this.Uc1_1.Title = "Label"; this.Uc1_1.Data = "TextBox"; //動的に配置する場合 test_uc1 uc = (test_uc1)Page.LoadControl("uc1.ascx"); uc.Title = "氏名"; uc.Data = "ほげ ふが"; this.PlaceHolder1.Controls.Add(uc); } }
逆に、test_uc1をnewして使用しようとすると、Titleフィールドの設定時にエラーが出ます。ユーザーコントロール内のサーバーコントロールの初期化が行われていないっぽい。