2009-02-16 91 views
13

我有以下非常简单的代码在ASP.NET AJAX动态地将控件添加到一个UpdatePanel

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

我的问题就来了,该文字控制功能只添加一旦。我已经搜索谷歌和博客网站(加书),但没有任何运气。我错过了什么?

回答

22

在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); 
    }    
} 
+0

正是我后,由于 – 2009-02-16 12:33:17

1

(虽然时间戳将你按下按钮,因为控制被重新创建每次更新)然而,这种方法不会保存动态控件的状态(或者是准确的,它会保存状态但不会加载它们)。 加载视图状态在页面生命周期的加载事件部分中调用,其中它将保存在视图状态下的控制值分配回去。 但是,如果此时未创建控件,则无法使用以前的数据加载控件,以便维护状态,新控件必须在加载事件之前或之前重新创建。

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

+1

同意,这是更好的。在回发期间保持ID相同允许视图状态正确应用。不管怎样,这应该按照http://msdn.microsoft.com/en-us/library/ms972976.aspx页面的初始化完成 – 2014-10-20 01:27:29