如何在动态GridView中实现批次金额页脚总计
解决方案:给动态生成的GridView添加金额总计页脚
没问题,我来帮你搞定这个页脚总计的需求!咱们需要做几个关键修改,同时还要修复一个你可能没注意到的标题重复问题,具体步骤和代码如下:
关键修改点
- 开启GridView的页脚显示
- 绑定
RowDataBound事件,在数据绑定过程中累加金额并在页脚显示总计 - 修复重复使用同一个Label导致标题全部显示最后一个批次的问题
- (可选但重要)避免SQL注入风险,改用参数化查询
修改后的完整代码
batchNo = Request.QueryString["numberOfbatch"]; string[] batchIds = batchNo.Split(','); // 提前拆分批次ID,避免重复操作 for (int i = 0; i < batchIds.Length; i++) { // 1. 创建新的GridView实例 GridView gv = new GridView(); // 开启页脚显示 gv.ShowFooter = true; // 设置GridView样式(可选,让表格更美观) gv.BorderStyle = BorderStyle.Solid; gv.BorderWidth = Unit.Pixel(1); gv.CellPadding = 5; gv.CellSpacing = 0; // 2. 绑定RowDataBound事件,处理金额累加和页脚显示 gv.RowDataBound += (sender, e) => { GridView currentGrid = sender as GridView; if (e.Row.RowType == DataControlRowType.DataRow) { // 提取当前行的批次金额并累加 decimal currentAmount = Convert.ToDecimal(DataBinder.Eval(e.Row.DataItem, "BatchAmount")); // 用GridView的Tag属性存储当前批次的总金额(避免全局变量冲突) if (currentGrid.Tag == null) { currentGrid.Tag = 0m; } currentGrid.Tag = Convert.ToDecimal(currentGrid.Tag) + currentAmount; } else if (e.Row.RowType == DataControlRowType.Footer) { // 设置页脚单元格内容 e.Row.Cells[0].Text = string.Empty; e.Row.Cells[1].Text = string.Empty; // 格式化总金额为两位小数,加上"Total"标识 e.Row.Cells[2].Text = $"Total: {Convert.ToDecimal(currentGrid.Tag):N2}"; // 给总计文本添加样式,比如加粗 e.Row.Cells[2].Font.Bold = true; // 给页脚行加边框,和表头/数据行对齐 e.Row.BorderStyle = BorderStyle.Solid; } }; // 3. 创建列绑定 BoundField BatchID = new BoundField(); BatchID.DataField = "BatchID"; BatchID.HeaderText = "Batch ID"; BatchID.HeaderStyle.Font.Bold = true; BoundField BatchDate = new BoundField(); BatchDate.DataField = "BatchDate"; BatchDate.HeaderText = "Batch Date"; BatchDate.HeaderStyle.Font.Bold = true; BoundField BatchAmount = new BoundField(); BatchAmount.DataField = "BatchAmount"; BatchAmount.HeaderText = "Batch Amount"; BatchAmount.HeaderStyle.Font.Bold = true; // 格式化金额列显示为两位小数 BatchAmount.DataFormatString = "{0:N2}"; BatchAmount.HtmlEncode = false; // 确保格式化生效 // 4. 修复标题问题:每次创建新的Label,避免重复使用同一个控件 Label batchLabel = new Label(); batchLabel.Text = $"Batch No: {batchIds[i]}"; batchLabel.Font.Bold = true; batchLabel.Style.Add("margin-bottom", "10px"); // 加个底部间距 // 配置GridView gv.AutoGenerateColumns = false; gv.EmptyDataText = "No batch data."; gv.Columns.Add(BatchID); gv.Columns.Add(BatchDate); gv.Columns.Add(BatchAmount); // 5. 安全查询数据(强烈建议用参数化查询避免SQL注入) // --- 原写法(有SQL注入风险)--- // sSql = $"select * from batchTable where BatchID = '{batchIds[i]}'"; // --- 推荐参数化查询(需要根据你的db类调整)--- SqlCommand cmd = new SqlCommand("select * from batchTable where BatchID = @BatchID"); cmd.Parameters.AddWithValue("@BatchID", batchIds[i]); gv.DataSource = db.returnDataSet(cmd); // 假设你的db类支持传入SqlCommand gv.DataBind(); // 6. 将控件添加到占位符 phGridView.Controls.Add(new LiteralControl("<br />")); phGridView.Controls.Add(batchLabel); phGridView.Controls.Add(new LiteralControl("<br />")); phGridView.Controls.Add(gv); }
代码说明
- 页脚显示:通过
gv.ShowFooter = true开启页脚,然后在RowDataBound事件中处理数据行的金额累加,最后在页脚行展示总计。 - 标题修复:原来的代码重复使用同一个
lbTitle控件,导致所有GridView的标题都会被最后一个批次覆盖,现在每次循环创建新的Label解决这个问题。 - SQL注入防护:直接拼接字符串到SQL语句中存在注入风险,推荐使用参数化查询,代码中给出了示例,你需要根据自己的
db类实现调整。 - 样式优化:添加了一些基础的样式设置,让表格更美观,你可以根据需求调整。
这样修改后,每个批次的GridView都会显示对应的金额总计页脚,完全符合你想要的效果!
内容的提问来源于stack exchange,提问作者Julie
相关产品推荐
相关产品推荐

