在动态添加的用户控件上维护usercontrol状态

时间:2009-10-15 18:39:38

标签: c# asp.net data-binding viewstate

我有一个页面可以在page_init事件上动态创建多个usercontrol,并将其添加到页面上的占位符。

用户将自己控制数据绑定到page_init上的转发器到大约10个字符串的集合,这些字符串为每个项目输出一个div。

用户控件上还有一个“查看更多”链接按钮。当我点击“查看更多”按钮时,它会将另一个集合数据绑定到第二个转发器,甚至更多的div。

问题:在其中一个用户控件上单击“查看更多”后,如果我在另一个用户控件上单击“查看更多”,则第一个用户控件上的“查看更多”数据将丢失。我怀疑是因为我没有重新添加控件,所以viewstate没有重新加载。

任何人都有任何想法,或者我对此只是偏离?谢谢。

2 个答案:

答案 0 :(得分:1)

问题是您需要在每个回发上重新创建动态控件并重新创建其视图状态。看一下这篇文章Dynamic Web Controls, Postbacks, and View State

答案 1 :(得分:0)

斯坦是对的。

当您点击链接时,会发生回发并丢失所有内容

我遇到了同样的问题,我的aproach在每次回发时重新创建了dinamics UserControls。

这篇文章http://www.codeproject.com/KB/user-controls/DynamicUC.aspx展示了一个例子,但我实现了不同的代码:

我的网页有以下方法,可以将控件添加到PlaceHolder。

    private void AdicionarControlesDinamicamente(int idPergunta)
{
    if (idPergunta > 0)
    {
        this.IdPerguntaAtual = idPergunta;
        PerguntaAtual = new Pergunta(this.IdPerguntaAtual);

        UserControl uc = LoadControl(PerguntaAtual.TipoResposta.CaminhoUserControl, PerguntaAtual.IdPergunta);
        phResposta.Controls.Add(uc);

        ViewState["ControlesDinamicosPerguntaCarregados"] = true;
    }
}

注意这行代码ViewState [“ControlesDinamicosPerguntaCarregados”] = true; 我存储的信息表明控件已经添加到页面中。

然后创建CreateChildControls以重新创建控件

    protected override void CreateChildControls()
{
    base.CreateChildControls();

    // CHeck if the controls have been added to page, case true, i call IncluirControlesDinamicamente() again
    // The Asp.Net will look into viewstate and wil find my controls there, so "he" will recreate their for me
    if (ViewState["ControlesDinamicosPerguntaCarregados"] != null)
        if (Page.IsPostBack)
            AdicionarControlesDinamicamente(this.IdPerguntaAtual);
}

我认为这有助于你。

PS:对不起我的英文。