2014-02-19 46 views
0

我有一個asp.net網站和一個用戶控件添加到頁面。 然後,我也有一個按鈕,一旦點擊就在頁面上添加第二個用戶控件。以編程方式添加用戶控件

protected void btnAdd_Click(object sender, EventArgs e) 
     { 
      Metric newControl = (Metric)LoadControl("~/Metric.ascx"); 
      Random rnd = new Random(); 
      newControl.ID = "id" + rnd.Next(); 
      placeholder.Controls.Add(newControl); 
     } 

的問題是,每個用戶控制具有這導致回發所以,當發生這種情況與btnAdd按鈕添加的用戶控制不再存在的下拉列表。

我明白這是因爲它只存在於調用btnAdd_Click方法時,我該如何克服這一點?

+0

在'Page_Init'或'Page_Load'(最近)重新創建它們時使用與以前相同的ID。因此,您需要保留已經創建的控件的數量,例如在'ViewState'中。 http://www.4guysfromrolla.com/articles/092904-1.aspx –

+0

此鏈接可以幫助http://stackoverflow.com/questions/682269/custom-control-loads-a-user-control-postback-events-是不是被觸發的?rq = 1,在這種情況下,你將不得不維護用戶控件的創建狀態或不能......以便能夠在頁面加載中重新加載它。這只是一個想法 –

回答

0

在WebForms上處理動態創建的控件非常複雜。因此,第一個建議是不使用動態添加的控件來解決問題,例如用Repeater或Visible/Invisible控件(不是很漂亮,但很穩定)。

如果這不可行,您需要在頁面生命週期的早期(例如在Page_Init中)重新創建動態添加的控件,以便可靠地連接事件。因此,您需要改變分配UserControls ID的方式,因爲您需要確定性方法將相同的ID分配給您重新創建的控件。你可以使用像Metric1,Metric2,...(最後一個'PlaceHolder.Controls'計數是你分配的數字)。爲了能夠訪問已添加的控件數量,您需要存儲它以便您可以在Page_Init中訪問它,例如,在您放置在頁面上的隱藏字段中。

然後,您需要添加代碼以重新創建Page_Init中的控件。因此,您需要知道頁面上已放置了多少個控件。您可以從請求的表單集合中檢索它,然後重新創建控件。

有關如何處理動態控件的詳細概述,請參見link

相關問題