2012-10-17 269 views
3

看看這段代碼:動態添加元素

 static int i = 0; 
     protected void Page_Load(object sender, EventArgs e) 
    { 
     HtmlButton myButton; 
     if (!Page.IsPostBack) 
     { 
      myButton = new HtmlButton(); 
      myButton.InnerText = "Button first load"; 
      myButton.ID = i.ToString(); 
      PlaceHolder1.Controls.Add(myButton); 
      i++; 
     } 
     else 
     { 
      myButton = new HtmlButton(); 
      myButton.InnerText = "Button postback" + i.ToString(); 
      myButton.ID = i.ToString(); 
      PlaceHolder1.Controls.Add(myButton); 
      i++; 
     } 
    } 

預期:

 first load: "Button first load" 
     first postback: first load + "Button postback1" 
     second postback: first postback + "Button postback2" ... and so on. 

有:

 "Button first load" 
     "Button postback1" 
     "Button postback2". 

爲什麼?

+0

你怎麼能指望按鈕'InnerText'包含字符串'第一加載+按鈕postback1'或'第一回發+按鈕postback2',如果你甚至沒有在你的代碼中? –

+0

我期望窗體上有新的按鈕元素。 –

+0

你有他們還是我錯了?你說你有:3個按鈕,分別是:「Button first load」,''Button postback1「'和'」button postback2「'。 –

回答

3

你預期的結果是真的錯了...... :)

眼下發生的事情是你寫的代碼到底是什麼:

1負載(未回傳):

myButton.InnerText = "Button first load"; 

然後:

"Button first load" 

第二,第三,第n個負載(回發):

myButton.InnerText = "Button postback" + i.ToString(); 

然後:

"Button postback1" 
"Button postback2" 
. 
. 
. 

UPDATE:

現在,我明白你的問題......

ASP.NET不堅持動態控件的狀態,因此不能在回發之後重新創建它們。

底線:您必須在每次回發後重新創建動態添加的控件。

這裏有一個答案,我2年多前給那說明你的處理這種情況的好方法:

https://stackoverflow.com/a/2982271/114029

+0

但每次這是對新對象的引用 - myButton = new HtmlButton(); –

+0

這就是爲什麼你會得到這個結果... –