2009-08-24 20 views
8

私はなぜLoadControlを使って動的コントロールを追加できるのかという疑問があります。例えば :LoadControlとASP.Netコントロールを構築する

public partial class wucReportParam : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
      wucDate() ctrl = new wucDate(); 
      pnl.Controls.Add(ctrl); 
    } 
} 

wucDateのPage_Loadメソッドでは、wucDateの子コントロールがヌルであるが、私は、次の方法を使用:wucDate、子のPage_Loadメソッドで

public partial class wucReportParam : System.Web.UI.UserControl 
    { 
     public Report Report; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
       ctrl = (wucDate)LoadControl(@"Reports\wucDate.ascx"); 
       pnl.Controls.Add(ctrl); 
     } 
    } 

をwucDateの制御がnullではありません。 誰でも私に説明することができますなぜasp .netは、wucDateの子コントロールを作成しないでください。私はコンストラクタを使用していますか?ありがとう

答えて

8

ユーザーコントロールを動的に読み込むときは、標準のASP.NETページイベントパイプラインが開始され、正常に進行するようにすることが重要です。新しい演算子を使用してユーザーコントロールのインスタンスを作成すると、そのユーザーコントロールはASP.NETのイベントシステムに正しく追加されません。イベント(Init、Load、PreRenderなど)が起動しない場合、コントロールは正常に機能しません。そのため、LoadControlを使用する必要があります。これは、ユーザーコントロールのインスタンスが正しく作成され、ASP.NETに添付されるようにするためです。

0

ここでは、ASP.NETが実行時にページコンポーネントを構築する方法について説明します。 ASP.NETでは、コードビハインドファイルで定義されたクラスがページに含まれていますが、その型は実行時まで存在しません。ページのように、コントロールが定義されていても、wucDate型は実行時にインクルードされるまで作成されません。このため、型を初期化し、ページのライフサイクルを通じて正しく実行するために、コントロールにLoadControlをロードする必要があります。

これは私の記憶の最高ですので、私が間違っている場合は私に知らせてください。

4

明らかに、typeof(またはGetType)でLoadControlを使用すると、子コントロールが初期化されていない「新規」と同じ問題が発生します。 LoadControlをASCXファイルへの文字列とともに使用すると動作します。

子コントロールを初期化しません。

LoadControl(typeof(MyReport), null); 

Works!

LoadControl("Report.ascx"); 
+0

docs/connectサイトでこれが表示される理由は次のとおりです。http://msdn.microsoft.com/en-us/library/ewtd66a0.aspx(コミュニティコンテンツへのスクロール)またはhttps:/ /connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?Feedback=103456 –

2

ユーザーコントロール内のコントロールの初期化は、ASCXファイルによって行われます。 "new SomeControl"だけを使用しても、この初期化は実行されません。その場合でも、ascxファイル内のすべてのデザイン(マークアップ)は失われます。

クラス "wucDate"は、完全なユーザーコントロールが継承する基本クラスのみであることに注意してください。これは、LoadControl( "wucDate.ascx")を使用するときと同じクラスではありません。

また、LoadControlにはページのライフサイクルに関係するものはほとんどありません。コンテナのControlsコレクションにコントロールを追加すると、その部分が処理されます。

関連する問題