在CollapablePanel控件的设计过程中,遇到了这样一个问题:当某一项面板展开时,执行页面后,控件中面板的状态将恢复到原先的状态,这样是不是特感到郁闷。
查了一下MSDN,从中知道了可以通过实现IPostBackDataHandler来实现。
下面分别给出实现代码:
1、在Page_Init将控件注册为需要回发处理的控件。
2、在OnPreRender中注册一个HtmlInputHidden控件,并将子面板集合的状态写入。
3、最后,通过LoadPostData从客户端获得状态
[ 完 ]
呵呵,是不是很简单哦!!
查了一下MSDN,从中知道了可以通过实现IPostBackDataHandler来实现。
下面分别给出实现代码:
1、在Page_Init将控件注册为需要回发处理的控件。
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
//遍列每一个CoolPanel,初始其状态
foreach(CollPanel p in m_Panels)
{
p.i_Expanded = m_ExpandSolePanel ? false : p.Expanded;
}
if(m_ExpandSolePanel)
{
m_Panels[0].i_Expanded = true;
}
//注册控件
if (Page != null)
{
Page.RegisterRequiresPostBack(this);
}
}
{
base.OnInit(e);
//遍列每一个CoolPanel,初始其状态
foreach(CollPanel p in m_Panels)
{
p.i_Expanded = m_ExpandSolePanel ? false : p.Expanded;
}
if(m_ExpandSolePanel)
{
m_Panels[0].i_Expanded = true;
}
//注册控件
if (Page != null)
{
Page.RegisterRequiresPostBack(this);
}
}
2、在OnPreRender中注册一个HtmlInputHidden控件,并将子面板集合的状态写入。
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
string s = "";
foreach(CollPanel p in m_Panels)
{
s += (p.i_Expanded.ToString() == "True" ? "1" : "0") + ",";
}
if (Page != null)
{
Page.RegisterHiddenField(this.ClientID + "_state", s);
}
}
{
base.OnPreRender(e);
string s = "";
foreach(CollPanel p in m_Panels)
{
s += (p.i_Expanded.ToString() == "True" ? "1" : "0") + ",";
}
if (Page != null)
{
Page.RegisterHiddenField(this.ClientID + "_state", s);
}
}
3、最后,通过LoadPostData从客户端获得状态
public bool LoadPostData(String postDataKey, NameValueCollection values)
{
//从客户端获得每个Panel的状态
string value = values[this.ClientID + "_state"];
if (value != null)
{
string[] s = value.Split(',');
for(int i = 0; i < m_Panels.Count; i++)
{
m_Panels[i].i_Expanded = s[i] == "1" ? true : false;
}
}
return false;
}
{
//从客户端获得每个Panel的状态
string value = values[this.ClientID + "_state"];
if (value != null)
{
string[] s = value.Split(',');
for(int i = 0; i < m_Panels.Count; i++)
{
m_Panels[i].i_Expanded = s[i] == "1" ? true : false;
}
}
return false;
}
[ 完 ]
呵呵,是不是很简单哦!!