2012-01-11 32 views
1

好吧,所以在这个项目我的工作我想提出一个硬编码的asp:面板的页面上,然后用加油吧:如何从动态创建的TableRow C#/ Asp.Net获取信息?

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

当SelectedIndexChanged事件与DropDownList中的tablerow的被创建然后填充6个左右tablecells然后让ASP发生了:文本框放在他们的里面。

最终它们都被添加到表格然后被添加到表格集合中。

这一切都工作得很好,但是当我去从这些动态创建的TableRows与foreach循环添加信息时,他们没有找到的地方,但TableHeaderRow是。

另外,当我点击添加并让它通过这个过程时,我得到没有空的异常,它是头后留下的唯一的东西,我所有的行都消失了。

反正我觉得我只是失去了一些真正愚蠢的东西。我已经浏览了很多论坛,帖子,MSDN,并且从未找到我的问题的答案。任何帮助将不胜感激!

+0

首先,您应该展示如何在循环中创建它们,将它们添加到表格中以及在回送中重新创建它们的位置。 – 2012-01-11 19:01:16

+0

你什么时候尝试向这些控件添加信息?你在哪里创建它们?你知道ASP.NET页面生命周期吗? – Oded 2012-01-11 19:01:20

回答

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`或类似的 - 所以在查找它时必须考虑到它。一旦确定该事件已经触发,您可以添加行。一旦它们被添加到那里,它们就不会消失。

正如我所说,工作很棘手,但我过去成功地做到了这一点。基于这个原因,动态控件通常很难处理。您可能想要考虑替代方案。无论如何,祝它好运。

相关问题