ASP.NET动态添加Table单元格获取Text返回空的解决方法
问题根因
- 你是通过向
TableCell.Controls集合添加LiteralControl的方式写入单元格内容,而TableCell.Text属性仅在直接对其赋值时才会返回对应字符串,不会自动拼接子控件的内容,因此直接访问.Text得到空值是预期行为。 - ASP.NET WebForm的动态创建服务器控件不会跨回发自动保留,如果你填充表格的逻辑仅在首次页面加载(即包裹在
If Not IsPostBack判断块中)时执行,那么按钮点击触发回发时,你动态添加的所有数据行不会被重建,此时Table2.Rows集合中仅存在你在ASPX页面静态定义的表头行,不仅取不到内容,甚至会出现索引越界错误。
解决方法
方法1:直接赋值Text属性(最简便)
填充单元格时无需创建LiteralControl,直接给TableCell.Text赋值即可,后续可直接通过.Text属性读取内容,修改填充循环代码如下:
For i = 0 To 8 Dim tcell As New TableCell tcell.Text = fields(i) ' 直接赋值Text属性 trow.Cells.Add(tcell) Next
修改后你原有读取单元格的代码Table2.Rows(3).Cells(2).Text即可正常返回内容。
方法2:遍历子控件读取LiteralControl内容
如果有特殊需求必须通过添加子控件的方式写入单元格内容,可以直接读取单元格内第一个LiteralControl的Text属性:
Dim targetCell As TableCell = Table2.Rows(3).Cells(2) Dim cellContent As String = CType(targetCell.Controls(0), LiteralControl).Text
必做配置:修正动态控件的加载时机
无论使用上述哪种方法,都要保证表格填充逻辑在每次页面生命周期中执行,不要将填充代码放在If Not IsPostBack判断块中,否则回发时动态行销毁,无法读取任何内容。
优化建议:如果后续需要获取用户修改后的表格值,不建议使用
asp:Table作为数据承载控件,替换为GridView、Repeater这类内置状态维护的数据控件更稳定;也可以在首次读取文本文件填充表格时,将原始数据存入ViewState或Session,回发时直接从存储的数据源中取值,比遍历控件可靠性更高。
内容的提问来源于stack exchange,提问作者Laurent F.
相关产品推荐
相关产品推荐

