使用Control State保存控件状态

大家在编写控件的时候总是需要保存一些状态,通常我们都是用的ViewState来保存的。但是当ViewState被禁用了,控件工作就不正常了。有没有其它的办法呢?有,asp.net2.0给我们提供Control State这个解决方案,它是无法被禁用的,但可以保存控件状态。下面介绍如何应用Control State。
要应用Control State,需要三个步骤:
1。为控件注册开启Control State功能,默认此功能是关闭的。
2。保存Control State
3。载入Control State

一、需要在OnInit方法中注册Control State功能,不能放在pageLoad中进行,pageLoad方法是在“载入Control State”后运行的。通过重写OnInit方法实现,如下:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
Page.RegisterRequiresControlState(this);
}

二、保存Control State,需要重写SaveControlState方法,如下:
protected override object SaveControlState()
{
object state= base.SaveControlState();
Pair p = new Pair(state, strSourceFile);
return p;
}
Pair对象是系统定义的对象,用来保存两个object对象。state是基类的ControlState,strSourceFile是自己需要保存的ControlState。

三、载入Control State,需要重写LoadControlState方法,如下:
protected override void LoadControlState(object savedState)
{
Pair p = (Pair)savedState;
if (p != null)
{
base.LoadControlState(p.First);
strSourceFile = (string)p.Second;
}
}
先载入基类的ControlState,然后再载入自己的ControlState。

下面是一个比较完整的例子:
namespace BinaryIntellect.UI
{
public class HyperLinkGroupWithControlState : Control
{
private string strSourceFile;
public string SourceFile
{
get
{
return strSourceFile;
}
set
{
strSourceFile = value;
}
}

private HyperLinkGroupDirection enumDir;

public HyperLinkGroupDirection Direction
{
get { return enumDir; }
set { enumDir = value; }
}

protected override void OnInit(EventArgs e)
{
base.OnInit(e);
Page.RegisterRequiresControlState(this);
}

protected override object SaveControlState()
{
object state= base.SaveControlState();
Pair p = new Pair(state, strSourceFile);
return p;
}

protected override void LoadControlState(object savedState)
{
Pair p = (Pair)savedState;
if (p != null)
{
base.LoadControlState(p.First);
strSourceFile = (string)p.Second;
}
}

protected override void Render(HtmlTextWriter writer)
{
DataSet ds = new DataSet();
ds.ReadXml(HttpContext.Current.Server.MapPath(SourceFile));
if (enumDir == HyperLinkGroupDirection.Horizontal)
{
writer.WriteFullBeginTag("table");
writer.WriteFullBeginTag("tr");
foreach (DataRow row in ds.Tables[0].Rows)
{
writer.WriteFullBeginTag("td");
writer.WriteBeginTag("a");
writer.WriteAttribute("href", row["url"].ToString());
writer.Write(">");
writer.Write(row["title"].ToString());
writer.WriteEndTag("a");
writer.WriteEndTag("td");
}
writer.WriteEndTag("tr");
writer.WriteEndTag("table");
}
else
{
writer.WriteFullBeginTag("table");
foreach (DataRow row in ds.Tables[0].Rows)
{
writer.WriteFullBeginTag("tr");
writer.WriteFullBeginTag("td");
writer.WriteBeginTag("a");
writer.WriteAttribute("href", row["url"].ToString());
writer.Write(">");
writer.Write(row["title"].ToString());
writer.WriteEndTag("a");
writer.WriteEndTag("td");
writer.WriteEndTag("tr");
}
writer.WriteEndTag("table");
}
}
}
}

本文是我看了一篇英文介绍后,做的部分意译,原英文地址:
http://www.bipinjoshi.net/articles/3380d5ce-b84e-443f-8c26-e97ec071292d.aspx
很通俗的英文,一般都可以看懂,呵呵~

 

http://hi.baidu.com/daijun2007/blog/item/0551d62f996f323f1f3089f9.html

你可能感兴趣的:(使用)