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

如何实现Telerik RadGrid的OnCustomAggregate,排除勾选行求和

问题:Telerik RadGrid自定义聚合:排除勾选行计算组页脚和网格页脚的价格总和

我在ASP页面中使用Telerik RadGrid,该网格按组织名列分组。我需要在组页脚和网格页脚中对价格列求和,但要排除复选框被勾选的行。

目前已经为价格列设置了Aggregate="Custom",并为RadGrid绑定了OnCustomAggregate="rg_CustomAggregate"事件,现在需要实现rg_CustomAggregate方法,遍历行计算未勾选行的价格总和,当前方法框架如下:

protected void rg_CustomAggregate(object sender, GridCustomAggregateEventArgs e) {
    int sum = 0;
    if (e.Item is GridGroupFooterItem) {
        // TODO: 实现逻辑
        e.Result = sum;
    }
    if (e.Item is GridFooterItem) {
        // TODO: 实现逻辑
        e.Result = sum;
    }
}

我在网上难以找到相关示例,求该方法的具体实现思路。


解决方案

我来帮你拆解这个实现逻辑,核心就是根据当前处理的是组页脚还是网格页脚,分别定位到对应的行集合,过滤掉勾选的行后再求和:

1. 组页脚的求和逻辑

当e.Item是GridGroupFooterItem时,我们只需要处理当前组下的所有数据行,检查每行的复选框状态,累加未勾选行的价格:

protected void rg_CustomAggregate(object sender, GridCustomAggregateEventArgs e) {
    // 建议用decimal类型存储价格,避免精度丢失,根据实际场景调整
    decimal sum = 0;
    if (e.Item is GridGroupFooterItem groupFooter)
    {
        // 获取当前组对应的所有数据行
        var groupDataItems = groupFooter.Group.DataItems;
        foreach (GridDataItem dataItem in groupDataItems)
        {
            // 替换成你实际的复选框ID
            CheckBox chkSelect = (CheckBox)dataItem.FindControl("chkSelect");
            if (chkSelect != null && !chkSelect.Checked)
            {
                // 替换成你价格列的DataField,这里用解析文本的方式,也可以直接取数据源对象
                if (decimal.TryParse(dataItem["Price"].Text, out decimal price))
                {
                    sum += price;
                }
            }
        }
        e.Result = sum;
    }
    if (e.Item is GridFooterItem footer)
    {
        // 遍历整个网格的所有数据行
        foreach (GridItem item in rg.MasterTableView.Items)
        {
            // 只处理数据行,跳过组头、组页脚等非数据项
            if (item is GridDataItem dataItem)
            {
                CheckBox chkSelect = (CheckBox)dataItem.FindControl("chkSelect");
                if (chkSelect != null && !chkSelect.Checked)
                {
                    if (decimal.TryParse(dataItem["Price"].Text, out decimal price))
                    {
                        sum += price;
                    }
                }
            }
        }
        e.Result = sum;
    }
}

几个关键注意点:

  • 控件与列名替换:一定要把代码中的chkSelect(复选框ID)和Price(价格列DataField)换成你实际项目中的对应值。
  • 强类型数据源优化:如果你的RadGrid绑定的是强类型集合(比如List<OrderModel>),可以直接从dataItem.DataItem取模型对象,这样比解析文本更可靠:
    var order = (OrderModel)dataItem.DataItem;
    if (!order.IsSelected)
    {
        sum += order.Price;
    }
    
  • 性能考量:如果网格数据量极大,遍历所有行可能有性能损耗,你可以在绑定数据时提前维护未勾选行的价格总和缓存;但常规数据量下,直接遍历完全够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:37:55