以上代码在为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"仍然能 |