好吧,所以在我正在研究的项目中,我正在页面上制作一个硬编码的asp:面板,然后填写:
当使用DropDownList发生selectedIndexChanged事件时,会创建tablerow,然后填充6个左右的tablecells,然后将asp:Textbox放在其中。
最终它们都被添加到tablerow中,然后将其添加到tablerowcollection中。
这一切都运行得很好,但是当我从这些动态创建的TableRows
中添加带有foreach循环的信息时,它们无处可寻,但TableHeaderRow是。
此外,当我单击添加并让它通过该过程时,我没有得到空异常,并且在它之后唯一剩下的是标题,我的所有行都消失了。
无论如何我觉得我只是缺少一些非常愚蠢的东西。我查看了很多论坛,帖子,MSDN,但从来没有找到我的问题的答案。任何帮助将不胜感激!
答案 0 :(得分:2)
您需要在Page_Init
而非Page_Load
的表格中添加动态行。如果您在Page_Load
中创建它,您的新行将不会添加到ViewState中,您将看到此问题。
不幸的是,您正在添加它们以响应服务器端事件,这可能会变得棘手。您仍需要在Page_Init
中添加行,但当页面回发并且您在Page_Init
时,则selectedIndexChanged
事件尚未触发。这在页面生命周期中还为时过早。
如果您想知道它是否已在Page_Init
被解雇,我找到的唯一方法是在此时检查Request.Form("__EVENTTARGET")
集合。这包含触发回发的控件的控件ID - 在您的情况下,这将是下拉列表。触发事件的控件将在那里,但ID将被限定,即不是MyControID而是ctl_MasterPageContentHolderID_NamingContainer1_MyControlID`等 - 所以在查找时你必须考虑它。一旦确定该事件已被触发,则可以添加行。一旦将它们添加到那里,它们就不会消失。
正如我所说,开始工作很棘手,但我过去已经成功完成了这项工作。通常情况下,动态控件很难处理。您可能想要考虑替代方案。不管怎么说,还是好运。