如何仅对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
相关产品推荐
相关产品推荐

