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

如何仅对ASP.NET GridView中可见行的G_Total列求和?

解决GridView仅对可见行的G_Total列求和的问题

你的问题核心在于行可见性的设置时机不对,以及累加逻辑依赖了数据源的原始数据而非可见行的显示值。我来给你梳理下问题根源,再提供修改方案:

问题分析

你当前在RowDataBound事件里先遍历所有行设置可见性,但RowDataBound是逐行触发的——当你修改其他行的可见性时,那些行的RowDataBound可能已经执行完了,隐藏行的数值早就被计入总计。另外,直接从DataItem取值也会忽略行的可见状态,因为DataItem是数据源的原始数据,和行是否展示无关。

修正方案

我们把行可见性设置和总计计算移到DataBound事件(GridView完成所有行绑定后触发),同时直接从可见行的控件中取值累加,确保只计算当前显示的行。

1. 修改前端GridView标签

添加OnDataBound事件绑定:

<asp:GridView ID="GridView9" runat="server" AllowPaging="false" AutoGenerateColumns="False" 
    ShowFooter="true" BackColor="White" DataKeyNames="ID" BorderColor="#999999" 
    CssClass="tableUserInfo" GridLines="Vertical" ShowHeaderWhenEmpty="True" PageSize="10" 
    OnRowDataBound="GridView9_RowDataBound" OnDataBound="GridView9_DataBound">
    <!-- 原有列代码保持不变 -->
</asp:GridView>

2. 修改后台代码

decimal grdTotal;

// 仅保留行绑定的基础逻辑(如控件样式初始化)
protected void GridView9_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Footer)
    {
        Label lbl = (Label)e.Row.FindControl("lblTotal");
        lbl.Font.Size = 12;
        lbl.ForeColor = System.Drawing.Color.White;
    }
}

// 在DataBound事件中统一处理行可见性和总计计算
protected void GridView9_DataBound(object sender, EventArgs e)
{
    txt_SessionId.Text = ddlSession.SelectedValue;
    int targetSessionId = int.Parse(txt_SessionId.Text);

    // 第一步:设置所有行的可见性
    foreach (GridViewRow row in GridView9.Rows)
    {
        if (row.RowType == DataControlRowType.DataRow)
        {
            TextBox sid = row.FindControl("txt_GSessionId") as TextBox;
            int rowSessionId = int.Parse(sid.Text);
            row.Visible = (rowSessionId == targetSessionId);
        }
    }

    // 第二步:累加可见行的G_Total值
    grdTotal = 0;
    foreach (GridViewRow row in GridView9.Rows)
    {
        if (row.Visible && row.RowType == DataControlRowType.DataRow)
        {
            Label lblGTotal = row.FindControl("lblGTotal") as Label;
            // 用TryParse避免格式异常,提升代码健壮性
            if (lblGTotal != null && decimal.TryParse(lblGTotal.Text, out decimal rowTotal))
            {
                grdTotal += rowTotal;
            }
        }
    }

    // 第三步:更新页脚总计
    if (GridView9.FooterRow != null)
    {
        Label lbl = GridView9.FooterRow.FindControl("lblTotal") as Label;
        if (lbl != null)
        {
            lbl.Text = "Rs. " + grdTotal.ToString("0");
        }
    }
}

关键改进点

  • 时机正确:DataBound在所有行绑定完成后触发,此时修改行可见性不会遗漏任何行的状态判断
  • 精准取值:直接从可见行的lblGTotal控件读取显示值,确保只计算当前展示的行
  • 容错处理:用decimal.TryParse避免因文本格式错误导致的程序崩溃

内容的提问来源于stack exchange,提问作者Turing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:17:12