快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

6.6 清除页面状态

在控件开发时,有时候需要清除子控件的页面状态,比如在创建子控件时,以下是一个在数据绑定时清除视图并创建子控件的应用场景:

/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
public override void DataBind()
{
   base.OnDataBinding(EventArgs.Empty);
   Controls.Clear();
   ClearChildViewState(); //清理视图状态 
   TrackViewState();
   CreateControlHierarchy(true);
   ChildControlsCreated = true;
}

本节介绍几个清理页面状态的方法,主要由Control基类提供。

1.HasChildViewState方法

获取一个值,该值指示当前服务器控件的子控件是否具有任何已保存的视图状态设置。如果有任何子控件具有已保存的视图状态信息,则返回true;否则返回false。

2.IsChildControlStateCleared方法

获取一个值,该值指示当前控件中包含的控件是否具有控件状态。如果该控件的子级不使用控件状态,则返回true;否则返回false。

3.ClearChildState方法

同时清除子控件的视图状态和控件状态。其方法体如下:

protected void ClearChildState()
{
   this.ClearChildControlState();
   this.ClearChildViewState();
}
4.ClearChildControlState方法 
清除控件状态。其代码如下:
protected void ClearChildControlState()
{
   if (this.ControlState >= ControlState.Initialized)
   {
     this.flags.Set(0x40000);
     if (this.Page != null)
     {
       this.Page.RegisterRequiresClearChildControlState(this);
     }
   }
}

控件状态是通过方法:

Page.RegisterRequiresControlState(this);

将控件注册为具有持久性控件状态的控件。同时也要调用方法:

this.Page.RegisterRequiresClearChildControlState(this);

清除控件状态,不同的是:此方法是内部方法。不供开发人员调用,只能通过ClearChild ControlState方法间接调用。

5.ClearChildViewState方法

此方法主要清除子控件的视图状态,其代码结构如下:

protected void ClearChildViewState()
{
   if (this._occasionalFields != null)
   {
     this._occasionalFields.ControlsViewState = null;
   }
}

方法体中设置控件视图状态的IDictionary对象ControlsViewState为null。

6.7 对动态添加控件的视图状态分析

这一节讲点与视图状态相关的有趣的东西。我们在开发ASP.NET页面时,有时候在Page_Load事件中动态创建控件,而当页面提交后,动态修改的数据就丢失了。举个例子,看看如下代码:

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

以上代码首先动态创建一个ListBox控件lb,在页面第一次请求时(提交后不再执行此句)为它增加一个集合项"子项1",最后把lb添加到当前form集合中。

这时如果单击页面中事先放置的"提交"按钮,则页面提交后不再看到"子项1",也就是说在视图状态中没有存储该item项。

为了解决此问题,把代码修改成:

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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号