2012-10-17 50 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

这就是为什么你会得到这个结果... –