1

好吧,所以在我正在处理的项目中,我在页面上制作了一个硬编码的 asp:panel,然后用以下内容填充它:

  1. 下拉列表
  2. 一个 asp:Table,带有一个 asp:TableHeaderRow
  3. 添加和取消按钮

当DropDownList 发生selectedIndexChanged 事件时,将创建表格行,然后填充6 个左右的表格单元格,然后将asp:Textboxes 放置在其中。

最终它们都被添加到 tablerow 中,然后被添加到 tablerowcollection 中。

这一切都很好,但是当我去添加这些TableRows使用 foreach 循环动态创建的信息时,它们找不到,但 TableHeaderRow 是。

此外,当我单击添加并让它完成该过程时,我没有得到任何空异常,并且唯一剩下的就是标题,我所有的行都消失了。

无论如何,我觉得我只是错过了一些非常愚蠢的东西。我浏览了很多论坛、帖子、MSDN,但从未找到我的问题的答案。任何帮助将不胜感激!

4

1 回答 1

2

您需要将动态行添加到您的表中Page_Initnot Page_Load。如果您在Page_Load新行中创建它,则不会将其添加到 ViewState 中,您将看到此问题。

不幸的是,您添加它们是为了响应可能会变得棘手的服务器端事件。您仍然需要添加行,Page_Init但是当页面发回并且您在其中时Page_InitselectedIndexChanged事件尚未触发。页面生命周期还为时过早。

如果您想知道它是否以Page_Init我发现的唯一方法触发,那就是Request.Form("__EVENTTARGET")在那时检查集合。这包含触发回发的控件的控件 ID - 在您的情况下,这将是下拉列表。触发事件的控件将存在,但 ID 将是合格的,即不是 MyControID,而是 ctl_MasterPageContentHolderID_NamingContainer1_MyControlID` 或类似的 - 因此您在查找它时必须考虑到它。一旦您确定该事件已触发,您就可以添加行。一旦它们被添加到那里,它们就不会消失。

正如我所说,开始工作很棘手,但我过去已经成功地做到了这一点。由于这个原因,通常动态控件很难使用。您可能需要考虑替代方案。无论如何,祝你好运。

于 2012-01-11T19:02:46.890 回答