2010-05-13 32 views
0

我想每一次上button_click事件添加用戶控件的一個實例,它適用於只在第一次。
我通過附加ViewState中的整數將ID添加到用戶控件中。
爲什麼它不爲後續點擊添加工作。
這裏是具有相同行爲的簡化版本。添加用戶控件每次在ButtonClick事件

protected void Button1_Click(object sender, EventArgs e) 
{ 
    HtmlButton btnClick = new HtmlButton(); 
    btnClick.ID = "bt" + Append.ToString(); 
    btnClick.InnerText = "Button 1"; 
    MainArea.Controls.Add(btnClick); 
}   
+0

你能添加按鈕,單擊代碼,請 – BritishDeveloper 2010-05-13 20:35:47

+0

沒有代碼,我不能肯定地說,但它很可能你只是通過點擊添加控件,像Control.ID =「blahblah」+ countFromViewState。你實際需要的是一個for循環,它會爲每個計數器刻度添加一個控制。否則,該頁面會在每次回發時清除添加的控件(單擊按鈕時)。 – CodexArcanum 2010-05-13 20:40:39

回答

0

好的,現在代碼已發佈,我可以確認問題。

每次單擊該按鈕,回發而成。在回發時,您添加新的按鈕,名稱包含您的計數。但是,當頁面在第二個按鈕點擊時重新呈現時,它會丟失您添加的所有控件,並僅添加一個(從此回發的按鈕單擊)。

所以你要做的就是建立一個循環是什麼,是這樣的:

protected void Button1_Click(object sender, EventArgs e) { 
    for(int i = 0; i < Append; i++) 
    { 
     HtmlButton btnClick = new HtmlButton(); 
     btnClick.ID = "bt" + i.ToString(); 
     btnClick.InnerText = "Button " + i; 
     MainArea.Controls.Add(btnClick); 
    } 
} 

這將增加一個按鈕,按照前文的點擊,假設「追加」是某種計數器,你是存儲在視圖狀態。

現在,這也假設你想每次點擊控制的一個實例。這是我認爲你說的。

+0

感謝您的回覆!我還有一個問題,你們。即使控件的id保持不變,我的viewstate也不會在回發期間持續存在。我正在按鈕上添加用戶控件,就像@CodexArcanum提及的一樣。這意味着第5次點擊我迭代5次並添加5個用戶控件,但以前的控件的id仍然相同。我需要做什麼才能在viewstate中保持userinput。 – 2010-05-13 22:04:40

0

我做一個地址的用戶控制類似的東西。

既然你動態添加控件,您需要重新創建後各回(每次添加另一個,則需要重新創建你加入先前控制時間)後的控制。

我保留了控件ID的數組列表(如果您希望viewstate保留內容,您需要創建具有相同ID的控件),這些數據還會跟蹤我以前添加並需要重新創建的控件的數量。然後我通過循環,並在我的網頁加載事件再次創建控件:

foreach (string id in AddressItemIDs) 
{ 
    addAddressControl(null, id); 
} 

,然後我的「的button1_Click」事件(在我的情況下,我使用鏈接按鈕...

protected void LinkButton1_Click(object sender, EventArgs e) 
    { 
     if (AddressCount == 0 || AddressCount < MaxAddresses && ((addressItem)addressContainer.Controls[addressContainer.Controls.Count-1]).HasAddress) 
     { 
      int i = 0; 
      string prefix = "addressItem_"; 
      while (AddressItemIDs.Contains(prefix + i)) i++; 

      AddressCount++; 
      addAddressControl(null, prefix + i); 

     } 
     Button1.Visible = (AddressCount < MaxAddresses); 
    } 

這裏是我的addAddressControl方法:

protected void addAddressControl(Address address, string id) 
    { 
     addressItem ai = (addressItem)LoadControl("~/controls/addressItem.ascx"); 
     ai.RemoveClicked += new EventHandler(ai_RemoveClicked); 
     ai.ID = id; 

     if (address != null) 
     { 
      ai.AddressID = address.AddressID; 
      ai.Address = address.Street; 
      ai.City = address.City; 
      ai.State = address.State; 
      ai.Zip = address.Zip; 
      ai.TypeID = address.TypeID; 
     } 
     if(!AddressItemIDs.Contains(id)) 
      AddressItemIDs.Add(id); 

     addressContainer.Controls.Add(ai); 
    } 
+0

根據這些控件的實際使用情況,查看永久存儲可能是值得的:主要是指SQL DB,但也有替代方案。 然後,您可以使用Repeater控件生成您的內容和數據庫,以在視圖和會話之間存儲您的狀態。 – CodexArcanum 2010-05-13 21:02:09

+0

我使用SQL數據庫來保存數據,但是我使用此控件和Ajax在此期間添加/編輯x個項目。 – earthling 2010-05-13 21:11:27

+0

感謝您的回覆!我還有一個問題,你們。即使控件的id保持不變,我的viewstate也不會在回發期間持續存在。我正在按鈕上添加用戶控件,就像@CodexArcanum提及的一樣。這意味着第5次點擊我迭代5次並添加5個用戶控件,但以前的控件的id仍然相同。我需要做什麼才能在viewstate中保持userinput。 – 2010-05-13 22:03:32

0
public partial class _Default : Page 
{ 
    public int n; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (ViewState["Controls"] != null) 
      n = (int)ViewState["Controls"]; 
     if (!Page.IsPostBack) 
      n = 0; 
     for (int i = 0; i <= n; i++) 
     { 
      TestUserControl uc = LoadControl("~/TestUserControl.ascx") as TestUserControl; 
      uc.ID = "TestControl" + i.ToString(); 
      PlaceHolder1.Controls.Add(uc); 
     } 

    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     TestUserControl uc = LoadControl("~/TestUserControl.ascx") as TestUserControl; 
     uc.ID = "TestControl" + n++.ToString(); 
     PlaceHolder1.Controls.Add(uc); 
     ViewState["Controls"] = n; 
    } 
}