Re: LoadControl & ViewState чегото я не до понимаю
От: Козьма Прутков Россия  
Дата: 28.04.05 08:46
Оценка:
> Итак собственно вопросы (помогите утрясти информацию в систему):
> 1. Для чего нужен ViewStat.
для того, чтобы хранить состояние страницы между постбеками.
> 4. Почему если я загружаю в рантайме пользовательский контрол в методе Page_Load то у меня в пользовательском контроле на Page_Load-е свойства textbox-а не инициализированы, а если грузить пользовательский контрол в методе страницы OnInit — все нормально.
> 5. Почему вне зависимости от того где загружать пользовательский контрол при обработке сообщения TextBox TextBox1.TextChanged в обработчике уже находяться корректные данные. тоесть получаеться то что при pageLoad одно а в обработчике другое.
а вот тут давайте обсудим. Вот код из класса Page (покоцаный):
private void ProcessRequestMain()
{
      try
      {
            this._requestValueCollection = this.DeterminePostBackMode();
            HttpContext context1 = this.Context;
            base.InitRecursive(null); //тут возникает событие Init
            if (this.IsPostBack)
            {
                  this.LoadPageViewState();
                  this.ProcessPostData(this._requestValueCollection, true); // тут обрабатываются данные, пришедшие в запросе
            }
            base.LoadRecursive(); // тут событие Load
            if (this.IsPostBack)
            {
                  this.ProcessPostData(this._leftoverPostData, false); // тут обрабатываются данные, пришедшие в запросе
                  this.RaiseChangedEvents(); // тут возникают события об изменившихся данных
                  this.RaisePostBackEvent(this._requestValueCollection);
            }
            base.PreRenderRecursiveInternal();
            this.SavePageViewState();
            base.RenderControl(this.CreateHtmlTextWriter(this.Response.Output));
      }
      catch ...
}

Итого имеем, что данные пришедшего запроса грузятся дважды: между Init и Load, а оставшиеся между Load и RaiseChangedEvents.
Теперь твоя ситуация. Ты в Load создаешь и добавляешь контрол, и сразу же требуешь от него данные. В нем пока данные из его ViewState'а (это происходит при добавлении контрола в коллекцию Controls). А пришедшие в запросе в него будут засунуты только после Load. Аналогично, если ты добавил контрол в Init'е, то они к Load'у в нем уже появятся. Вот собсно и все.
Posted via RSDN NNTP Server 1.9
Да хранит вас господь в сухом прохладном месте...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.