ASP.NET如何保留原有布局动态创建并填充HtmlTable表格
完全可以实现,能1:1还原原有静态表格的布局、样式和控件逻辑,不会出现列错位问题,也不需要强制绑定单一数据源。
你之前的代码跑不通、插内容错位的核心原因
HtmlTable服务端控件没有Columns属性,表格列是依附在每一行的Cells集合下的,遍历不存在的属性必然报错。- 直接给
HtmlTable拼InnerHtml写入带runat="server"的ASP.NET服务端标签是无效的,页面生命周期不会解析你后置代码拼进去的服务端控件,这些标签只会被当成普通文本输出,既不能后台赋值也无法取值。 - 手动拼HTML字符串很容易漏写单元格、搞错
colspan值,你之前插入新行只写了1个<td>,但原有表格每行要么2列要么4列,列数不匹配自然会出现空白错位。
推荐实现方案
你可以根据自己的改动成本选,两种都能完全匹配原有布局:
方案1:保留静态表格骨架,动态增改行(改动最小)
不用把整个表格全改成动态生成,固定不变的行继续留在ASPX页面里,只对需要动态新增、修改的部分用服务端对象操作,完全不会破坏原有对齐规则:
- 不要拼HTML字符串,所有行、单元格、服务端控件都通过后台实例化创建:需要加行就
New HtmlTableRow(),需要加单元格就New HtmlTableCell(),需要放Label、TextBox就new对应控件,加到单元格的Controls集合,再把单元格加到行的Cells集合,最后把行插入到tblDates.Rows的指定索引位置即可。 - 插入新行的时候严格对齐原有列结构:原有数据行是4列的,你插的新行也要凑够4个td;原有行是2列带
colspan="2"的,你就给对应单元格设置一样的ColSpan属性,绝对不会错位。 - 插入ESO提交行的示例VB代码:
' 实例化新行 Dim newRow As New HtmlTableRow() newRow.ID = "ESOSubmitRow" ' 第一列:说明文本Label Dim cell1 As New HtmlTableCell() Dim lblSubmittedToESO As New Label() lblSubmittedToESO.ID = "lblSubmittedToESO" lblSubmittedToESO.Text = "Date Site Plan Submitted to ESO for Approval: " cell1.Controls.Add(lblSubmittedToESO) newRow.Cells.Add(cell1) ' 第二列:日期输入框 Dim cell2 As New HtmlTableCell() Dim txtSubmittedToESO As New TextBox() txtSubmittedToESO.ID = "txtSubmittedToESO" cell2.Controls.Add(txtSubmittedToESO) newRow.Cells.Add(cell2) ' 第三、四列:和其他行结构保持一致,补全右侧列避免错位 Dim cell3 As New HtmlTableCell() Dim lblESOFlow As New Label() lblESOFlow.ID = "lblESOFlow" lblESOFlow.Text = "ESO Review: " cell3.Controls.Add(lblESOFlow) newRow.Cells.Add(cell3) Dim cell4 As New HtmlTableCell() Dim txtESOFlow As New TextBox() txtESOFlow.ID = "txtESOFlow" cell4.Controls.Add(txtESOFlow) newRow.Cells.Add(cell4) ' 把行插到指定位置,比如表头和ECO提交行之间(索引从0开始,表头是0,ECO行是1,插在索引1的位置就对) tblDates.Rows.Insert(1, newRow)
- 你从4个存储过程拿到的数据,和之前静态表格的赋值逻辑完全一样,通过控件ID找到对应实例给
Text属性赋值就行,不用改原有数据填充的代码。
方案2:全动态构建表格(长期可维护性最高)
如果想彻底去掉页面上的静态表格代码,也可以1:1还原所有布局:
- ASPX页面只留一个空的服务端表格标签:
<table id="tblDates" runat="server" border="1"></table>即可。 - 后台先把表格所有行的结构做成配置:包括行ID、每列的控件类型、控件ID、显示文本、是否跨列、对齐方式、是否根据数据动态显示,固定行和动态行都放进配置里。
- 页面加载时遍历配置,逐行创建
HtmlTableRow、逐单元格创建HtmlTableCell,把对应控件实例化后塞进单元格,统一设置样式、跨列、对齐属性,最后加到表格的行集合里。 - 存储过程返回的数据直接按照配置的控件ID映射赋值即可,后续要加行、删行、调整列结构只需要改配置,不用动页面标签,也不会出现拼字符串导致的标签不闭合、列数不对的问题。
注意:不要通过拼
InnerHtml的方式加服务端控件,所有需要后台赋值、取值的Label、TextBox都要通过后台实例化的方式创建,纯静态内容(比如帮助图标、固定文本)可以直接给单元格InnerHtml赋值,不会有问题。
内容的提问来源于stack exchange,提问作者Mr Ambitious
相关产品推荐
相关产品推荐

