ASP.NET Webforms中如何动态设置HtmlTableCell的值并解决FindControl空值问题
问题解答
1. 批量赋值返回null的原因
FindControl方法默认只查找当前容器的直接子控件,不会递归遍历子孙控件。你的name1~name20是嵌套在table→tr层级下的,不属于页面的直接子控件,因此直接调用Page.FindControl自然找不到对应控件。- 确认所有
<td>标签都添加了runat="server"属性,否则后台不会生成对应的控件对象,查找结果也会是null。 - 你现有循环里连续三次给
tableId赋值是无效操作,前两次的查找结果都会被最后一次的this.FindControl结果覆盖,没有实际作用。
2. 快速修复现有代码方案
你可以新增一个递归查找控件的公用方法,代码如下:
private Control FindControlRecursive(Control root, string id) { if (root.ID == id) return root; foreach (Control c in root.Controls) { Control found = FindControlRecursive(c, id); if (found != null) return found; } return null; }
修改你的循环逻辑即可正常赋值:
for(int i=1; i<=20; i++) { HtmlTableCell td = FindControlRecursive(this, "name" + i) as HtmlTableCell; if(td != null) { td.InnerText = i.ToString(); } }
3. 长期更优方案(支持扩展到上百个表格)
你当前写死静态table的方案可维护性极差,后续表格数量增长后手动改代码的成本非常高,推荐使用数据绑定控件动态生成所有表格:
aspx页面代码
<asp:Repeater ID="rptTables" runat="server"> <ItemTemplate> <table class="table table-responsive-sm table-bordered table-hover" style="align-content:center;"> <tr><th>Header<%# Eval("Index") %></th></tr> <tr><td><%# Eval("Content") %></td></tr> </table> </ItemTemplate> </asp:Repeater>
后台绑定代码
public void Page_Load() { if(!IsPostBack) { // 需要多少个表格就修改Enumerable.Range的第二个参数即可,100个就填100 var tableData = Enumerable.Range(1, 20) .Select(x => new { Index = x, Content = x.ToString() }) .ToList(); rptTables.DataSource = tableData; rptTables.DataBind(); } }
该方案完全不需要手动编写重复的table、td代码,也不需要逐个给控件赋值,后续扩展只需要调整数据源即可,维护成本极低。
内容的提问来源于stack exchange,提问作者Biraj Dahal
相关产品推荐
相关产品推荐

