2011-01-21 16 views
9

ASP.NETのライフサイクルについて、Web上に多数の情報がありますが、ページにコントロールを動的に追加することはできません。PreInit Initのコントロールの作成と追加の違い

一般に2つの状況があります。マスターページを持つaspxページと、ないページ。私が現在読んでいる本(70-515セルフ・プリップ)は、プレイベント・イベント・ハンドラーのマスター・ページのないページにコントロールを追加すると言います。コンテンツページにコントロールを動的に追加するには、そのロジックをinitイベントハンドラに配置する必要があります。

MSDN(http://msdn.microsoft.com/en-us/library/ms178472.aspx)によると、イベントハンドラの前処理でダイナミックコントロールを作成または再作成し、コントロールのプロパティを読み込みまたは初期化する必要があります。 init eventhandler(これは私にとって最も理にかなっています)。周りを回って私は多くの人々がコントロールを追加するためにinitイベントハンドラを使用して参照してください。

私はここで少し失われています - 正しい方法は何ですか?また、イベントハンドラの前処理を使用している場合、すべてのコントロールがnullの場合、どのようにコントロールをページに追加できますか?たとえば、動的に作成されたテキストボックスをパネルコントロールに追加する必要がある場合

敬具、

答えて

8

ViewStateを追跡する前に制御プロパティを設定して遊ぶ必要がある場合を除き、個人的には動的制御追加ロジックをOnInitイベントに配置します。

(マスターページを使用している場合)あなたが本当に動的PREINIT中にコントロールを追加したい場合は、常にこのような何かを行うことができます:「マスター」プロパティにアクセス

protected override void OnPreInit(EventArgs e) 
{ 
    base.OnPreInit(e); 

    TextBox textBox = new TextBox(); 
    textBox.Text = "Dynamic TextBox"; 
    textBox.Width = 100; 
    textBox.ReadOnly = false; 

    var master = this.Master; 

    plcHolder.Controls.Add(textBox); 
    textBox.ApplyStyleSheetSkin(this.Page); 

} 

はコントロール し、それをインスタンス化しますうまくいくはずですが、ネストされたマスターページのシナリオ(this.Master.Master ...)、パネルの更新などが得られます。

これは、関連すると役に立つかもしれません:http://weblogs.asp.net/ysolodkyy/archive/2007/10/09/master-page-and-preinit.aspx

また、私は考えることができる理由のひとつ(ほかには、定義されたページのライフサイクル以下)MSは、我々のでPREINITイベントに動的にコントロールを作成するためのすべてのロジックを配置することをお勧めしますInitイベントが行われる前に、利用可能なすべてのスキンプロパティを自動的に適用するテーマサービスを利用できます。

は、あなたのマークアップがそのような何かに見えると言う:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Trace="true" Inherits="_Default" Theme="Test" %> 

を...

<form id="form1" runat="server"> 

<div> 
<p> 
    <asp:TextBox ID="TextBox1" runat="server" TextMode="Password" Text="Control TextBox"></asp:TextBox> 
</p> 
<p> 
    <asp:PlaceHolder ID="plcHolder" runat="server"></asp:PlaceHolder> 
</p> 

</div> 
</form>... 

とあなたはこのような皮膚があります:あなたはどのようにInitイベントにすべてのスキンプロパティを行く前に気づくでしょう

private TextBox tb1; 
protected override void OnPreInit(EventArgs e) 
{ 
    base.OnPreInit(e); 
    tb1 = new TextBox(); 
    tb1.Text = "PreInit Dynamic TextBox"; 

    Trace.Write(String.Format("tb1 Wrap Property-> {0}",tb1.Wrap)); 
    Trace.Write(String.Format("tb1 Text Property-> {0}", tb1.Text)); 
    Trace.Write("Add tb1 to the placeholder."); 
    plcHolder.Controls.Add(tb1); 
    Trace.Write(String.Format("tb1 Wrap Property-> {0}", tb1.Wrap)); 
    Trace.Write(String.Format("tb1 Text Property-> {0}", tb1.Text)); 
} 

protected override void OnInit(EventArgs e) 
{ 
    Trace.Write(String.Format("tb1 Wrap Property-> {0}", tb1.Wrap)); 
    Trace.Write(String.Format("tb1 Text Property-> {0}", tb1.Text)); 
    base.OnInit(e); 
} 



protected void Page_Load(object sender, EventArgs e) 
{ 
    Trace.Write(String.Format("tb1 Wrap Property-> {0}", tb1.Wrap)); 
    Trace.Write(String.Format("tb1 Text Property-> {0}", tb1.Text)); 

} 

<asp:TextBox runat="server" BackColor="Yellow" Wrap="false" Text="Skin property!" > </asp:TextBox> 

ただ、後ろのあなたのコードにこれを追加します動的に作成されたテキストボックスに既に適用されています:)

1

PREINITイベントは、私には新鮮でしたが、私はあなたが追加の作業を行うには、コントロールのロードとビューステート負荷の間で仲介のステップを持っているように、それは、理にかなっていると思います。ダイナミックコントロールをロードするためにinitイベントを使用しましたが、これはいつも問題なく動作しています。私はあなたもどちらかでOKだと思うが、もしMSがPreInitをお勧めするなら、私はそのルートを行くと言うだろう。このようにInitでは、必要な作業を追加してUIを作成するルーチンと、ビューステートのロード前にUIを更新するルーチンを分けることができます。

HTH。

関連する問題