2009-02-16 86 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