Разница с созданием и добавлением элементов управления в PreInit Init - PullRequest
10 голосов
/ 21 января 2011

В Интернете тонны информации о жизненном цикле ASP.NET, но я не могу понять, когда динамически добавлять элементы управления на страницу.

В общем, есть две ситуации;Страница aspx с главной страницей, а одна без.Книга, которую я сейчас читаю (70-515, самоподготовка), говорит, что нужно добавить элементы управления на страницу без главной страницы в preinit обработчике событий.Чтобы динамически добавлять элементы управления на страницу содержимого, я должен поместить эту логику в обработчик событий init.

Согласно MSDN (http://msdn.microsoft.com/en-us/library/ms178472.aspx) я должен создать или воссоздать динамические элементы управления в обработчике событий preinit, и только читать или инициализировать свойства элементов управления в обработчике событий init (что для меня наиболее разумно)Многие люди используют обработчик событий init для добавления элементов управления.

Итак, я немного растерялся - как это правильно? А при использовании обработчика событий preinit, как вы можете добавить элементы управления на свою страницу, когдавсе элементы управления равны нулю? Например, когда вам нужно добавить динамически создаваемое текстовое поле в элемент управления панели?

С уважением,

Ответы [ 2 ]

9 голосов
/ 21 марта 2011

Если вам не нужно поэкспериментировать с настройкой свойств элемента управления перед отслеживанием 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);

}

доступ к свойству "Master" приведет к созданию элементов управления и это должно работать, но вы получаете вложенные сценарии главных страниц (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>...

и у вас есть такой скин:

<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 все свойства обложки уже применяются к динамически создаваемому текстовому полю:)

2 голосов
/ 21 января 2011

Событие PreInit было для меня новым, но я думаю, что это имеет смысл, так что у вас есть промежуточный шаг между загрузкой элементов управления и загрузкой viewstate для выполнения дополнительной работы.Мы использовали событие init для загрузки динамических элементов управления, и это всегда работало для нас без проблем.Я думаю, что вы будете в порядке с любым из них, но если MS рекомендует PreInit, я бы сказал, пойти по этому пути.Таким образом, в Init вы можете выполнить любую дополнительную работу, которая может вам понадобиться, и отделить подпрограмму, которая создает пользовательский интерфейс, от подпрограммы, которая может обновлять его перед загрузкой представления состояния.

...