Разница с созданием и добавлением элементов управления в PreInit Init

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

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

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

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

С уважением,

2 ответа

Решение

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

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

НТН.

Другие вопросы по тегам