如何从动态创建的TableRow C#/ Asp.Net获取信息?

时间:2012-01-11 18:58:25

标签: c# webforms dynamically-generated

好吧,所以在我正在研究的项目中,我正在页面上制作一个硬编码的asp:面板,然后填写:

  1. 下拉列表
  2. 一个asp:Table,带有一个asp:TableHeaderRow
  3. 添加和取消按钮
  4. 当使用DropDownList发生selectedIndexChanged事件时,会创建tablerow,然后填充6个左右的tablecells,然后将asp:Textbox放在其中。

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

    这一切都运行得很好,但是当我从这些动态创建的TableRows中添加带有foreach循环的信息时,它们无处可寻,但TableHeaderRow是。

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

    无论如何我觉得我只是缺少一些非常愚蠢的东西。我查看了很多论坛,帖子,MSDN,但从来没有找到我的问题的答案。任何帮助将不胜感激!

1 个答案:

答案 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`等 - 所以在查找时你必须考虑它。一旦确定该事件已被触发,则可以添加行。一旦将它们添加到那里,它们就不会消失。

正如我所说,开始工作很棘手,但我过去已经成功完成了这项工作。通常情况下,动态控件很难处理。您可能想要考虑替代方案。不管怎么说,还是好运。