2011-06-01 51 views
1

我已经在我的aspx页面上有一个asp.net表格控件,包含 asp.net TableRow对象;向ASP.NET表动态添加列 - 回发

我的目的是通过点击一些图像按钮动态添加列到这个表。 该表由几个TableRow对象组成,每个对象默认包含带有某个标签的ASP.NET TableCell。我试图通过单击图像按钮添加列,据说向该行的单元集合中添加一个新单元格。例如,如果我想添加包含特定行的下拉列表一栏,我做的:

DropDownList ddl = new DropDownList(); 
      TableCell tableCell= new TableCell(); 
      tableCell.Controls.Add(ddl); 
      tableRow.Cells.Add(tableCell); 

的问题是,我永远不能超越加一列,因为每当我点击asp.net“ AddColumn“按钮,在我到达生命周期中的某个位置之前创建的”AddColumn“按钮,以及其单元集合。 我想过以某种方式保存会话中的行对象的副本,但我不认为 正确的时间点进行保存。

而且不管怎么说 - 是不是asp.net应该保持一切都在视图状态?请帮助并提供解决方案。我完全困惑。

的ASPX BTW看起来是这样的:

<asp:TableRow runat="server" ID="RequestorEmailRow"> 
         <asp:TableCell runat="server" Text="..."> 
         </asp:TableCell> 
        </asp:TableRow> 
+1

您必须在Page_Load中最新的每次回发中重新创建已添加的TableCells。在ViewState中保存创建的单元格的数量。为了避免使用DropDownLists的视图状态和事件处理问题,您还需要确保它们在每次回发时都获得相同的ID。 – 2011-06-01 09:22:24

回答

1

的ASP.NET视图状态只保存控件的值,而不是控制自己的存在。视图状态在Page_InitPage_Load之间反序列化。如果动态地将<asp:样式对象添加到网页中,则必须在Page_Init中重新创建它们,否则ASP.NET将不处理其视图状态。

更好的方法是使用GridView控件(在工具箱的“数据”部分。)与asp:Table不同,asp:GridView的视图状态包含您可能添加的所有行。

+0

page_init解决方案听起来不错,但请您详细说明我应该怎么做? – user181218 2011-06-01 09:39:27

+0

@ user181218:有关动态控制方式的更多信息,请参见[本文](http://www.4guysfromrolla.com/articles/082102-1.aspx)。这是一个痛苦的使用;如果我是你,我会检查出GridView控件。 – Andomar 2011-06-01 09:48:59