2012-03-30 6 views
4

MSDN говорит, что создавать динамические элементы управления в PreInit Event жизненного цикла страницы.Создание динамических элементов управления в PreInit Событие жизненного цикла страницы?

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

Почему?

Какое преимущество получается при создании в PreInit Event ?.

Я видел код, где разработчики создают динамические элементы управления в методе Page_Load?

Если есть разница ?.

С уважением

+0

http://stackoverflow.com/q/4761273/284240 'OnLoad' может работать, но не всегда, вы находитесь в безопасности в' OnInit'. –

ответ

4

Page_Load работает нормально, если вам не нужно беспокоиться о сохранении, но если вам нужно упорствовать его, Load этап не там, где вы должны добавить эти элементы управления на блок управления ViewState через постбэков.

Динамические элементы управления должны находиться в иерархии управления страницы до загрузки ViewState. Перед загрузкой - инициализация - только один этап. Это означает, что если вы хотите, чтобы ваши динамические элементы управления сохраняли состояние просмотра, вы должны добавить их в иерархию управления в событиистраницы.

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

Но ум, что вы не можете получить доступ к ViewState в Init событие, потому что он еще не загружен. Таким образом, вам нужно использовать другой носитель для сохранения переменных по обратной почте (например, сеанс), если это необходимо.

+0

Я не понимаю, что вы имеете в виду: «если вы хотите, чтобы ваши динамические элементы управления сохраняли состояние просмотра, вы должны добавить их в иерархию элементов управления в событии Init на странице».У меня возникла проблема, когда мне нужно было получить доступ к динамическим элементам управления ViewState для детей после создания их для сохранения значений, которые будут использоваться через обратные передачи, и я мог бы использовать их ViewState в событии 'Load' страницы после установки родителя. Что мне не хватает? – ceztko

+0

[Здесь] (http://stackoverflow.com/a/23143377/213871) для примера, о котором я говорил. – ceztko

0

Tim, Спасибо за ответ. Я сделал небольшой эксперимент, в котором я создаю и добавляю элемент управления TextBox динамически в методе Page_Load.

В событии Postback щелчка кнопки на странице я пытаюсь получить значение текстового свойства TextBox. Я могу получить значение в событии нажатия кнопки, когда элемент управления динамически добавляется в событие Page_Load, а не в метод OnPreInt. Я думаю, что значение Text сохраняется в ViewState, даже если элемент управления добавлен в метод Page_Load.

следующий код:

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

Вы также можете создавать элементы управления на странице_Load, но помните, что загрузка страницы запускается после загрузки состояния «Состояние».

Смежные вопросы