如何遍历动态生成的HTML表格并根据单元格文本修改背景色?
如何遍历动态生成的HTML表格并根据单元格文本修改背景色?
我明白你现在遇到的问题了——你用字符串拼接生成了HTML表格,然后想在后台通过服务器控件的方式去遍历修改单元格样式,但发现根本找不到这个表格的引用对吧?这是因为你生成的是纯HTML字符串,哪怕加了runat="server",ASP.NET也不会把它解析成服务器端的Table控件实例,所以FindControl自然拿不到对象。
下面给你两种可行的解决方案,你可以根据自己的需求选择:
方案一:生成HTML时直接添加样式(推荐)
最简单直接的方式就是在生成表格HTML字符串的阶段,就根据单元格文本判断并添加背景色样式,这样不需要后续再去查找控件。只需要修改你的ConvertDataTableToHTML方法即可:
public static string ConvertDataTableToHTML(DataTable dt) { string html = "<table id=\"tbl_1\" class=\"table table-hover table-condensed\">"; // 添加表头行 html += "<thead><tr>"; for (int i = 0; i < dt.Columns.Count; i++) html += "<th style=\"background-color: #800000; color: #FFFFFF; font-weight: bold\">" + dt.Columns[i].ColumnName + "</th>"; html += "</tr></thead>"; // 修正了原代码中标签顺序的小问题 // 添加数据行 for (int i = 0; i < dt.Rows.Count; i++) { html += "<tr>"; for (int j = 0; j < dt.Columns.Count; j++) { string cellText = dt.Rows[i][j].ToString().ToLower(); // 根据文本判断是否添加背景色样式 string cellStyle = cellText != "not run" ? " style=\"background-color: red\"" : ""; html += $"<td{cellStyle}>{dt.Rows[i][j].ToString()}</td>"; } html += "</tr>"; } html += "</table>"; return html; }
这样修改后,生成的HTML会直接带有符合条件的背景色样式,你只需要像之前一样把结果赋值给myTBL_1.InnerHtml即可,不需要后续的遍历代码。这种方式逻辑清晰,性能也更好,因为少了一次控件查找和遍历的过程。
方案二:创建服务器端Table控件(适合需要后续操作控件的场景)
如果你确实需要在后台把表格作为服务器控件来管理(比如后续还要动态修改内容),那就要放弃字符串拼接的方式,直接创建System.Web.UI.WebControls.Table控件,然后添加到页面的容器中:
OracleDataReader dtReader; objCmd = new OracleCommand(varname1, objConn); dtReader = objCmd.ExecuteReader(); if (dtReader.HasRows == true) { DataTable dt1 = new DataTable(); dt1.Load(dtReader); // 设置DataTable属性的代码不变 dt1.Columns[2].ReadOnly = false; dt1.Columns[2].MaxLength = 200; dt1.Columns[3].ReadOnly = false; dt1.Columns[3].MaxLength = 200; dt1.Columns[4].ReadOnly = false; dt1.Columns[4].MaxLength = 200; dt1.Columns[5].ReadOnly = false; dt1.Columns[5].MaxLength = 200; SG_COUNT_STATUS4(dt1); // 创建服务器端Table控件 System.Web.UI.WebControls.Table dynamicTable = new System.Web.UI.WebControls.Table(); dynamicTable.ID = "tbl_1"; dynamicTable.CssClass = "table table-hover table-condensed"; // 添加表头 TableRow headerRow = new TableRow(); foreach (DataColumn col in dt1.Columns) { TableHeaderCell headerCell = new TableHeaderCell(); headerCell.Text = col.ColumnName; headerCell.Style.Add("background-color", "#800000"); headerCell.Style.Add("color", "#FFFFFF"); headerCell.Font.Bold = true; headerRow.Cells.Add(headerCell); } dynamicTable.Rows.Add(headerRow); // 添加数据行并设置样式 foreach (DataRow row in dt1.Rows) { TableRow dataRow = new TableRow(); foreach (var item in row.ItemArray) { TableCell cell = new TableCell(); cell.Text = item.ToString(); string cellText = cell.Text.ToLower(); if (cellText != "not run") { cell.BackColor = System.Drawing.Color.Red; } dataRow.Cells.Add(cell); } dynamicTable.Rows.Add(dataRow); } // 将Table控件添加到页面容器(比如你的myTBL_1是Panel控件) myTBL_1.Controls.Add(dynamicTable); }
这种方式创建的是真正的服务器端控件,ASP.NET会管理它的生命周期,之后你也可以通过FindControl("tbl_1")找到它(注意要在合适的页面生命周期阶段创建,比如Page_Init或Page_Load,否则回发后可能找不到)。
内容来源于stack exchange
相关产品推荐
相关产品推荐

