10

Web には ASP.NET ライフ サイクルに関する情報がたくさんありますが、ページにコントロールを動的に追加するタイミングがわかりません。

一般に、2 つの状況があります。マスターページのある aspx ページとない aspx ページ。私が現在読んでいる本 (70-515 自己準備) には、preinit イベント ハンドラーでマスター ページのないページにコントロールを追加すると書かれています。コンテンツ ページにコントロールを動的に追加するには、そのロジックを init イベント ハンドラに配置する必要があります。

MSDN (http://msdn.microsoft.com/en-us/library/ms178472.aspx) によると、preinit イベント ハンドラーで動的コントロールを作成または再作成し、init イベント ハンドラー (これは私には最も理にかなっている)。グーグルで調べてみると、多くの人が init イベントハンドラを使用してコントロールを追加しています。

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

敬具、

4

2 に答える 2

9

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

さらに、私が考えることができる理由の 1 つは (定義されたページのライフサイクルに従うこと以外に)、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>...

そして、あなたはこのような肌を持っています:

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

これをコードビハインドに追加するだけです:

 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));

}

Init イベントに入る前に、すべてのスキン プロパティが動的に作成されたテキスト ボックスに既に適用されていることに気付くでしょう :)

于 2011-03-21T14:01:26.430 に答える
2

PreInit イベントは私にとって初めてのことでしたが、コントロールの読み込みとビューステートの読み込みの間に追加の作業を行うための中間ステップがあるため、理にかなっていると思います。init イベントを使用して動的コントロールをロードしましたが、これは常に問題なく機能しています。どちらでも問題ないと思いますが、MS が PreInit を推奨している場合は、その方法をお勧めします。このように、Init では、必要な追加作業を行い、UI を作成するルーチンとビューステートの読み込み前に UI を更新する可能性のあるルーチンを分離することができます。

HTH。

于 2011-01-21T17:47:14.163 に答える