drummery

博客园 首页 新随笔 联系 订阅 管理
      保持自定义控件的两种方式:通过ViewState和使用ControlState。使用ViewState保存状态受到一些制约,例如EnableViewState必须为True,使用ControlState可以不受该限制。ControlState默认处于未启用状态,用于存储一些重要的控件数据(缺少该数据控件无法正确显示)。使用ControlState主要分为三个部分:

      1. 注册ControlState
      2. 重写SaveControlState方法
      3. 重写LoadControlState方法

      注册ControlState

      因为ControlState默认处于为启用状态,因此需要在页面的OnInit方法调用RegisterRequiresControlState(Control)方法注册要启用ControlState的控件。注意要在OnInit方法中注册,因为后面提到的LoadControlState和SaveControlState方法都在此后发生,而Page_Load方法在该两个方法之后才被调用。
protected override void OnInit(EventArgs e)
{
    
base.OnInit(e);
    RegisterRequiresControlState(webusercontrol1);
}

      重写SaveControlState()

      该方法返回包含控件状态的对象,可以理解成Page框架将该方法的返回值保存起来。该方法首先调用base.SaveControlState()方法获取出基类希望保存的对象,然后使用一个Pair对象将希望保存的自定义数据保存起来,并返回该Pair对象。
    protected override object SaveControlState()
    
{
        Object state 
= base.SaveControlState();
        Pair p 
= new Pair(state, DateTime.Now.ToString());
        
return p; 
    }

      重写LoadControlState()

      该方法获取保存的控件状态,savedState中是保存的控件状态,可以理解成将savedState进一步恢复到控件。首先向状态savedState转换为Pair类型,然后调用基类的LoadControlState()方法恢复默认状态,并将自定义保存的状态做恢复。
protected override void LoadControlState(object savedState)
{
    Pair p 
= savedState as Pair;
    
base.LoadControlState(p.First);
    m_strValue 
= p.Second.ToString();
}
  

      参考文章

      Persisting State Information
     
posted on 2008-02-25 15:17  Drummer  阅读(859)  评论(0编辑  收藏  举报