保持自定义控件的两种方式:通过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方法在该两个方法之后才被调用。
重写SaveControlState()
该方法返回包含控件状态的对象,可以理解成Page框架将该方法的返回值保存起来。该方法首先调用base.SaveControlState()方法获取出基类希望保存的对象,然后使用一个Pair对象将希望保存的自定义数据保存起来,并返回该Pair对象。
重写LoadControlState()
该方法获取保存的控件状态,savedState中是保存的控件状态,可以理解成将savedState进一步恢复到控件。首先向状态savedState转换为Pair类型,然后调用基类的LoadControlState()方法恢复默认状态,并将自定义保存的状态做恢复。
参考文章
Persisting State Information
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);
}
{
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;
}
{
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();
}
{
Pair p = savedState as Pair;
base.LoadControlState(p.First);
m_strValue = p.Second.ToString();
}
参考文章
Persisting State Information