快速业务通道

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

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

以上代码在为ListBox控件lb增加集合子项时之前,先启用Items属性的视图跟踪监控。这样当页面再提交时,则集合项"子项 1"仍然能够呈现。扩展一下,多增加几个Item并设置几个为选中状态,再次提交页面,增加的几个item仍然能够被视图状态成功保存,且能够记住当前是否选中状态。这是为什么呢?原来ListBox控件的属性Items的继承基类ListControl中有个ListItemCollection类型的 items对象,像"子项1"这些item就是被增加到items对象中进行管理的。关键的一点是,ListItemCollection集合对象实现了 IStateManager接口,看一下它的类定义:

/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
public sealed class ListItemCollection : IList, ICollection, IEnumerable, IStateManager
{
   // Fields
   private ArrayList listItems;
   private bool marked;
   private bool saveAll;

   // Methods
   public ListItemCollection();
   public void Add(string item);
   public void Add(ListItem item);
   public void AddRange(ListItem[] items);
   public void Clear();
   public bool Contains(ListItem item);
   public void CopyTo(Array array, int index);
   public ListItem FindByText(string text);
   internal int FindByTextInternal(string text, bool includeDisabled);
   public ListItem FindByValue(string value);
   internal int FindByValueInternal(string value, bool includeDisabled);
   public IEnumerator GetEnumerator();
   public int IndexOf(ListItem item);
   public void Insert(int index, string item);
   public void Insert(int index, ListItem item);
   internal void LoadViewState(object state);
   public void Remove(string item);
   public void Remove(ListItem item);
   public void RemoveAt(int index);
   internal object SaveViewState();
   int IList.Add(object item);
   bool IList.Contains(object item);
   int IList.IndexOf(object item);
   void IList.Insert(int index, object item);
   void IList.Remove(object item);
   void IStateManager.LoadViewState(object state);
   object IStateManager.SaveViewState();
   void IStateManager.TrackViewState();
   internal void TrackViewState();

   // Properties
   public int Capacity { get; set; }
   public int Count { get; }
   public bool IsReadOnly { get; }
   public bool IsSynchronized { get; }
   public ListItem this[int index] { get; }
   public object SyncRoot { get; }
   bool IList.IsFixedSize { get; }
   object IList.this[int index] { get; set; }
   bool IStateManager.IsTrackingViewState { get; }
}

ListItemCollection类实现了IStateManager接口下的几个视图状态相关方法,因为它自身具有视图状态管理能力。基于此,在增加到ListBox对象子项之前,调用这句:

(lb.Items as IStateManager).TrackViewState();

把它的视图跟踪监控功能打开,即从此刻起视图状态将记录它所有的修改,当然包括它增加的"子项1"项。这就是页面提交"子项1"仍然能

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