2012-03-30 22 views
4

MSDNは、ページライフサイクルのPreInitイベントで動的コントロールを作成すると述べています。PreInitでダイナミックコントロールを作成するページライフサイクルのイベント?

http://msdn.microsoft.com/en-us/library/ms178472.aspx

なぜですか?

PreInit Eventで作成することによって得られる利点は何ですか?

私は開発者がPage_Loadメソッドで動的コントロールを作成しているコードを見てきましたか?

違いがあれば?

よろしくあなたがコントロールのViewStateポストバック間での保存を心配する必要はありませんが、あなたはそれを永続化する必要がある場合は、これらのコントロールを追加する必要があります場合は、Loadステージがない場合は正常に動作Page_Load

+0

http://stackoverflow.com/q/4761273/284240 'OnLoad'はうまくいくかもしれませんが、必ずしもそうではありません。あなたは' OnInit'の安全面にいます。 –

答えて

4

ダイナミックコントロールは、ViewStateがロードされる前にページのコントロール階層内に存在する必要があります。 Load View State - Initializationの前にはステージが1つしかありません。つまり、ダイナミックコントロールにビューステートを保持させる場合は、ページのInitイベントのコントロール階層に追加する必要があります。

http://aspnet.4guysfromrolla.com/demos/printPage.aspx?path=/articles/092904-1.aspx

しかし、それはまだロードされていないので、あなたがViewStateInitでイベントにアクセスすることはできません心。したがって、必要に応じて、セッションなどのポストバックに変数を格納するために、別の永続性媒体を使用する必要があります。

+0

「ダイナミックコントロールにビューステートを保持させ、ページのInitイベントのコントロール階層に追加する必要がある」という意味を理解できません。私は子供の動的コントロールのViewStateに、ポストバック全体で使用される値を永続化するために作成した後、ViewStateにアクセスする必要があり、親を設定した後にViewStateをページの 'Load'イベントで使用することができます。私は何が欠けていますか? – ceztko

+0

[Here](http://stackoverflow.com/a/23143377/213871)を参照してください。 – ceztko

0

Tim、 お返事ありがとうございます。 私は、Page_LoadメソッドでTextBoxコントロールを作成して動的に追加する小さな実験を行った。

ページのButtonのポストバッククリックイベントで、TextBoxのTextプロパティの値を取得しようとしています。 コントロールがOnPreIntメソッドではなくPage_Loadイベントに動的に追加されたときに、Buttonのclickイベントで値を取得できました。 コントロールがPage_Loadメソッドで追加されていても、Text値がViewStateに保持されていると思います。次のコード

<div> 
     <p> 
      <asp:Label ID="lbl" runat="server" /> 
     </p> 
     <p> 
      <asp:PlaceHolder ID="plcHolder" runat="server"></asp:PlaceHolder> 
     </p> 
     <p> 
      <asp:Button ID="btn" runat="server" Text="Click" OnClick="btn_Click" /> 
     </p> 
    </div> 


private void _createTextBox() 
{ 
    TextBox textBox = new TextBox(); 
    textBox.ID = "txtBox"; 
    textBox.Width = 250; 
    textBox.ReadOnly = false; 
    plcHolder.Controls.Add(textBox); 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    _createTextBox(); 
    if (!this.IsPostBack) 
    { 
     Control ctrl = plcHolder.FindControl("txtBox"); 
     if (ctrl != null) 
     { 
      TextBox txtBox = ctrl as TextBox; 
      txtBox.Text = DateTime.Now.ToString(); 
     } 
    } 
} 
protected void btn_Click(object sender, EventArgs e) 
{ 
    Control ctrl = plcHolder.FindControl("txtBox"); 
    if (ctrl != null) 
    { 
     TextBox txtBox = ctrl as TextBox; 
     lbl.Text = txtBox.Text; 
    } 
} 

親切に私に知らせては、これは正しいですか私が間違って何をやっていますか?

2

この返信はオリジナルのポスターには遅れるかもしれませんが、他の人に役立つと思いました。

アプリケーション/ウェブサイトでマスターページを使用しない場合は、Page_PreInitイベントでコントロールを作成することをお勧めします。しかし、マスターページを使用しており、実行時にコンテンツページにコントロールを作成したい場合、Page_Initは理想的なイベントです。

Page_Loadでコントロールを作成することもできますが、ビューステートが読み込まれた後にページの読み込みが発生することに注意してください。

関連する問題