快速业务通道

庖丁解牛Asp.net3.5控件和组件开发技术系列—页面状态机制(四)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
够显示在页面上的原因。

只有实现了IStateManger接口的集合才能够调用TrackViewState方法打开视图监控。如果没有实现此接口的对象,还有一种方法可以实现视图状态功能,把最初的代码修改成如下格式:

protected void Page_Load(object sender, EventArgs e)
{
   ListBox lb = new ListBox();
   this.form1.Controls.Add(lb);
   if (!Page.IsPostBack)
   {
     lb.Items.Add("子项1");
   }
}

在上面的代码中对之前不能够保存视图状态的代码,仅调换了一下代码顺序。把this.form1.Controls.Add(lb)这句放到了lb.Item.Add("子项1")之前。运行页面并单击"提交"按钮,就会发现item"子项1"也能够保存视图状态。仅作了代码调整即使 lb实现了视图状态保存,这是什么原因呢?这里的关键语句:

this.form1.Controls.Add(lb);

中的关键方法Add起了重要作用。Controls集合的Add方法最终调用的是Control控件基类中的方法AddedControl。直接看一下AddedControl的代码实现:

/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
protected internal virtual void AddedControl(Control control, int index)
{
   if (control.OwnerControl != null)
   {
     throw new InvalidOperationException(SR.GetString("Substitution_ 
     NotAllowed"));
   }
   if (control._parent != null)
   {
     control._parent.Controls.Remove(control);
   }
   control._parent = this;
   control._page = this.Page;
   control.flags.Clear(0x20000);
   Control namingContainer = this.flags[0x80] ? this : this._namingContainer;
   if (namingContainer != null)
   {
     control.UpdateNamingContainer(namingContainer);
     if ((control._id == null) && !control.flags[0x40])
     {
       control.GenerateAutomaticID();
     }
     else if ((control._id != null) || ((control._occasionalFields != null)
     && (control._occasionalFields.Controls != null)))
     {
       namingContainer.DirtyNameTable();
     }
   }
   if (this._controlState >= ControlState.ChildrenInitialized)
   {
     control.InitRecursive(namingContainer);
     if (((control._controlState >= ControlState.Initialized) && (control.
     RareFields != null)) && control.RareFields.RequiredControlState)
     {
       this.Page.RegisterRequiresControlState(control);
     }
     if (this._controlState >= ControlState.ViewStateLoaded)
     {
       object savedState = null;
       if ((this._occasionalFields != null) && (this._occasionalFields.
       ControlsViewState != null))
       {
         savedState = this._occasionalFields.ControlsViewState[index];
         if (this.LoadViewStateByID)
         {
           control.EnsureID();
           savedState =this._occasionalFields.ControlsViewState [control. ID];
           this._occasi

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号