下午好。
我有一个在Page_Load上动态创建的面板列表。控件是通过Control.Add(p)添加的;方法。代码遵循
Panel p = new Panel();
p.ID = "cell_" + i + "_" + j;
p.Attributes.Add("runat", "server");
p.TabIndex = -1;
p.Attributes.Add("class", "box");
p.Attributes.Add("onClick", "clicked(this);");
p.Attributes.Add("onKeypress", "changeValue(event, this);");
p.Style.Add(HtmlTextWriterStyle.Top, top + "%");
p.Style.Add(HtmlTextWriterStyle.Left, left + "%");
p.Attributes.Add("Text", value);
PanelList.Add(p);
这段代码在for循环中,每个循环都会改变i,j,left,right和value变量。
现在,当我在Page_Load完成之前调用此函数时:
foreach (Control c in clientGrid.Controls)
{
Response.Write(c.ClientID.ToString());
}
成功写入所有动态创建的面板的所有客户端ID。
但是,当我在回发上运行foreach函数时,Response.write什么都不显示。就好像asp忘记了这些面板一样!
现在我在Page_Init()上听到了,需要重新渲染控件!
我不确定如何做到这一点,经过许多谷歌,似乎无法找到答案。
我尝试使用recurtion迭代所有Page.Controls并拉出
System.Web.UI.WebControls.Panel
但仍然没有运气:(
如果我的问题不清楚,我无法提供更多代码和细节:)
三江源
亚历
答案 0 :(得分:1)
每次回发时,必须将动态添加的控件重新添加到页面中。我不知道这是否符合您的逻辑要求,但请确保您在(!isPostback)条件之外的page_load方法中添加控件。然后确保在将控件添加到页面后调用用于写出客户端ID的逻辑。
如果你需要在回发之间存储有关这些控件的状态信息,你可能需要使用一些javascript和hiddenfields。
所有的事件处理程序都应该在Page_Load之后调用,所以如果你在Page_Load中添加控件,你应该没问题。 OnPreRender有时候对这种事情很有用。它在Page_Load之后但在回发完成之前被调用。