ASP.NET中Page_Load触发时如何保留表格值?VB.NET动态表格读取异常
解决ASP.NET VB.NET动态表格回发后Rows.Count为0的问题
这个问题我碰到过好多次啦,核心原因就是ASP.NET的页面生命周期机制:你动态创建的表格只在第一次加载时被添加到服务器端的控件树里,但页面回发(比如点击按钮)时,服务器会重新构建控件树,如果没有重新创建这个表格,服务器端就“认不出”页面上显示的那些行,自然tablename.rows.count会返回0——毕竟客户端看到的只是静态HTML,和服务器端的控件树是两回事儿。
具体解决步骤:
保存动态表格的状态
回发时页面会重置,所以得把表格的关键信息(比如行数、自定义内容)存在ViewState或者Session里,这样回发后能恢复表格的结构。推荐用ViewState,因为它是页面级的,更轻量。在页面初始化阶段重新创建表格
必须在Page_Init或者Page_Load事件(早于点击事件触发的阶段)里,根据保存的状态重新创建表格,并且保证表格的ID完全一致,这样服务器才能把客户端的回发数据和服务器端控件对应起来。确保表格被添加到固定的容器控件中
比如把表格放到Panel里,不要直接加到页面的Form里,这样回发时更容易通过FindControl找到表格。
VB.NET代码示例:
先写表格的创建逻辑和状态保存:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then ' 第一次加载时,创建5行的动态表格,并把行数存到ViewState BuildDynamicTable(5) ViewState("TotalTableRows") = 5 Else ' 回发时,从ViewState读取行数,重新构建表格 Dim rowCount As Integer = CInt(ViewState("TotalTableRows")) BuildDynamicTable(rowCount) End If End Sub Private Sub BuildDynamicTable(ByVal rowCount As Integer) ' 创建服务器端Table控件,固定ID很重要! Dim dynamicTable As New Table() dynamicTable.ID = "tablename" ' 循环添加行和单元格 For i As Integer = 0 To rowCount - 1 Dim tableRow As New TableRow() Dim tableCell As New TableCell() tableCell.Text = "第" & (i + 1) & "行内容" tableRow.Cells.Add(tableCell) dynamicTable.Rows.Add(tableRow) Next ' 把表格加到Panel容器里(提前在ASPX页面加一个<asp:Panel ID="Panel1" runat="server"></asp:Panel>) Panel1.Controls.Add(dynamicTable) End Sub
然后在点击事件里读取行数:
Protected Sub btnGetRowCount_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnGetRowCount.Click ' 从Panel里找到表格控件 Dim targetTable As Table = CType(Panel1.FindControl("tablename"), Table) If targetTable IsNot Nothing Then ' 现在就能正确获取行数了 Response.Write("当前表格行数:" & targetTable.Rows.Count.ToString()) End If End Sub
额外提醒:
- 别只在按钮点击事件里创建动态表格!如果是用户触发某个操作才生成表格,那也要在回发时根据保存的状态重新创建,否则服务器端控件树里永远没有这个表格。
- 如果表格里有用户输入的内容(比如TextBox),回发时重新创建表格后,服务器会自动恢复这些输入值,前提是ID一致且创建时机正确。
内容的提问来源于stack exchange,提问作者Rachel Ludmir
相关产品推荐
相关产品推荐

