【问题标题】:Adding controls dynamically to an UpdatePanel in ASP.NET AJAX将控件动态添加到 ASP.NET AJAX 中的 UpdatePanel
【发布时间】:2010-10-07 20:58:00
【问题描述】:

我有以下非常简单的代码

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

我的问题在于 Literal 控件只添加一次。我搜索了谷歌和博客网站(加上书籍),但没有任何运气。我错过了什么?

【问题讨论】:

    标签: asp.net ajax updatepanel


    【解决方案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);
        }            
    }
    

    【讨论】:

      【解决方案2】:

      我同意上面的答案,但是这种方法不会保存动态控件的状态(或者准确地说,它会保存状态但不加载它们)。 加载视图状态在页面生命周期的加载事件部分调用,它分配回保存在视图状态中的控件值。 但是,如果此时未创建控件,则无法使用以前的数据加载它们,因此要保持状态,必须在加载事件时或之前重新创建新控件。

      protected void Page_Load(object sender, EventArgs e)
      {
          //PS: Below approach saves state as id is constant, it simply generates a new control with same id hence viewstate loads the value
          if (IsPostBack)
          {
              int count = 0;
      
              if (ViewState["ButtonCount"] != null)
              {
                  count = (int)ViewState["ButtonCount"];
              }
      
              count++;
              ViewState["ButtonCount"] = count;
      
              for (int i = 0; i < count; i++)
              {
                  TextBox literal = new TextBox();
                  //literal.Text = DateTime.Now.ToString();
                  literal.ID = "Textbox" + i.ToString();
      
                  //UpdatePanel1.ContentTemplateContainer.Controls.Add(literal);
                  PlaceHolder1.Controls.Add(literal);
      
              }
          }
      }
      

      Dynamically adding controls View State and postback

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 2013-11-17
      • 2018-04-26
      • 1970-01-01
      相关资源
      最近更新 更多