当前位置:编程学习 > C#/ASP.NET >>

PlaceHolder如何保存视图状态


public Label lbl = new Label();
protected void Page_Load(object sender, EventArgs e)
    {
        lbl.ID = "lbl";
        if (!IsPostBack)
        {
            lbl.Text = "123";
        }
        PlaceHolder1.Controls.Add(lbl);
    }

这样写无法保存视图状态,页面刷新后lbl就不等于123了,试问palceholder添加控件如何让其自动保存视图状态? --------------------编程问答-------------------- 帮顶 --------------------编程问答-------------------- 试试:
    public Label lbl = new Label();

    protected void Page_Load(object sender, EventArgs e)
    {
        lbl.ID = "lbl";
        PlaceHolder1.Controls.Add(lbl);
        if (!IsPostBack)
        {
            lbl.Text = "123";
        }
    }
--------------------编程问答-------------------- PlaceHolder是不可以的,除非楼上那样Page_Load每次都去加载,但是这样程序并不是最优化的

可以采用NickLee.Web.UI.DynamicControlsPlaceholder


    protected void Page_Load(object sender, EventArgs e)
    {

        if (!IsPostBack)
        {
           Label lbl = new Label();
           //注意先设置ID
           lbl.ID="lbl";
    if (DCP.FindControl("lbl") == null)
                {
                    DCP.Controls.Add((Control)lbl);
                }
            lbl.Text = "123";
        }
        
    }


控件参考FortuneBase:www.cnblogs.com/mail-ricklee --------------------编程问答-------------------- 1、2年前我曾经说过几次,我们在各种asp.net论坛上以及书籍中做的许多“范例”是误导初学者的。实际上很多初始化功能应该写在Page_PreRender中,而不应该写在Page_Load中。Page_Load应该准确地完成它自己的功能,但尽量应该避免把那些本应该在之后的事件处理程序中写的代码放到这里。

如果我写这段代码,我会写:
    public Label lbl = new Label();

    protected void Page_Load(object sender, EventArgs e)
    {
        lbl.ID = "lbl";
        PlaceHolder1.Controls.Add(lbl);
    }

    protected void Page_PreRender(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            lbl.Text = "123";
        }
    }


--------------------编程问答--------------------
引用 3 楼 mail_ricklee 的回复:
PlaceHolder是不可以的,除非楼上那样Page_Load每次都去加载,但是这样程序并不是最优化的

可以采用NickLee.Web.UI.DynamicControlsPlaceholder

C# codeprotectedvoid Page_Load(object sender, EventArgs e)
    {if (!IsPostBack)
        {
           Label lbl=new Label();//注意先设置ID           lbl.ID="lbl";if (DCP.FindControl("lbl")==null)
                {
                    DCP.Controls.Add((Control)lbl);
                }
            lbl.Text="123";
        }
        
    }

控件参考FortuneBase:www.cnblogs.com/mail-ricklee


楼主不是问其它写法是不是“最优化”的,而是问他这样写其结果的机制是什么。 --------------------编程问答-------------------- 我们总是在Page_Load中去设置值,或者绑定数据。为什么这样?因为这样最简单。如果我们双击页面,它默认弹出的事件方法是Page_PreRender,我相信我们网上、大多数入门书上那些写在Page_Load中的大多数代码就都会移动到PreRender中去。

大家都图省事随便写代码,写的人多了也就成了“标准”了,似乎天经地义,而很少有人考虑这仅仅是因为最初的一个小意外而造成的。 --------------------编程问答-------------------- 继承于PlaceHolder,但是ViewState保存控件状态


protected override void LoadViewState(object savedState) 
{
object[] viewState = (object[]) savedState;

//Raise PreRestore event
OnPreRestore(EventArgs.Empty);

//recreate the child controls recursively
Pair persistInfo = (Pair) viewState[0];
foreach(Pair pair in (ArrayList) persistInfo.Second)
{
RestoreChildStructure(pair, this);
}

//Raise PostRestore event
OnPostRestore(EventArgs.Empty);
            //修改部分
            //base.LoadViewState(viewState[1]);
            if(viewState[1]!=null)
            {
                byte[] temp = (byte[])viewState[1];
                object obj = NickLee.Common.CompressData.UnCompressObject(temp);
                base.LoadViewState(obj);
                return;
            }
            base.LoadViewState(viewState[1]);
}

protected override object SaveViewState()
{
if(HttpContext.Current == null)
return null;

object[] viewState = new object[2];
viewState[0] = PersistChildStructure(this, "C");
            //修改部分
            if(base.SaveViewState()!=null)
            {
                byte[] temp = NickLee.Common.CompressData.Compress(base.SaveViewState());
                viewState[1] = temp;
            }
            //viewState[1] = base.SaveViewState();
return viewState;
}
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,