You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在动态GridView中实现批次金额页脚总计

解决方案:给动态生成的GridView添加金额总计页脚

没问题,我来帮你搞定这个页脚总计的需求!咱们需要做几个关键修改,同时还要修复一个你可能没注意到的标题重复问题,具体步骤和代码如下:

关键修改点

  1. 开启GridView的页脚显示
  2. 绑定RowDataBound事件,在数据绑定过程中累加金额并在页脚显示总计
  3. 修复重复使用同一个Label导致标题全部显示最后一个批次的问题
  4. (可选但重要)避免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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:08:28