小编典典

在ASP.NET AJAX中将控件动态添加到UpdatePanel

ajax

我有以下非常简单的代码

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
    <asp:PlaceHolder ID="PlaceHolder1" runat="server">
    </asp:PlaceHolder>
    <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
</ContentTemplate>
</asp:UpdatePanel>

和背后的代码

protected void Button1_Click(object sender, EventArgs e)
{
    Literal literal = new Literal();
    literal.Text = DateTime.Now.ToString();
    literal.ID = DateTime.Now.Ticks.ToString();

    // These both work fine the first time the button is clicked
    // but the second time nothing is added.
    UpdatePanel1.ContentTemplateContainer.Controls.Add(literal);
    PlaceHolder1.Controls.Add(literal);
}

我的问题在于,文字控件只能添加一次。我曾搜索过Google和博客网站(以及书籍),但没有任何运气。我想念什么?


阅读 291

收藏
2020-07-26

共1个答案

小编典典

在asp.net中,每次回发都会自动生成ASPX文件中的控件。您创建的控件不在ASPX代码中,因此框架不会为您创建它们。第一次执行Button1_Click方法时,您会向页面添加一个额外的控件。第二次执行Button1_Click方法时,您又回到了另一个帖子上,并且第一个多余的按钮已被忘记。因此,回发的结果是您再次获得一个额外的按钮。

每次单击按钮都会创建一个额外的控件(尽管由于重新创建了控件,所以每次按下按钮时时间戳都会更新)

protected void Button1_Click(object sender, EventArgs e)
{
    int count = 0;

    if (ViewState["ButtonCount"] != null)
    {
        count = (int)ViewState["ButtonCount"];
    }

    count++;
    ViewState["ButtonCount"] = count;

    for (int i = 0; i < count; i++)
    {
        Literal literal = new Literal();
        literal.Text = DateTime.Now.ToString();
        literal.ID = DateTime.Now.Ticks.ToString();

        UpdatePanel1.ContentTemplateContainer.Controls.Add(literal);
        PlaceHolder1.Controls.Add(literal);
    }            
}
2020-07-26