博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

IPostBackDataHandler实现CollapablePanel控件的状态保持

Posted on 2007-04-05 17:29  faib  阅读(667)  评论(2编辑  收藏  举报
  在CollapablePanel控件的设计过程中,遇到了这样一个问题:当某一项面板展开时,执行页面后,控件中面板的状态将恢复到原先的状态,这样是不是特感到郁闷。
  查了一下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);
            }

        }

  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);
            }

        }

  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;
        }

  [  完  ]

  呵呵,是不是很简单哦!!