给数据源增加合计行的通用方法

我们有时候会遇到这种需求:将导出的XX数据增加合计行,或者在页面增加合计行等等,遇到这种需求,如果要加合计的内容比较多怎么办,有点要疯了的感觉。这时候就想能不能有一个通用的方法,一次性都加上。

我想到加工已经获取到的数据源,一下是我写的两个方法,第一个方法用来给Datatable加合计行,第二个方法用来给List<T>泛型对象加合计行

 /// <summary>
        /// 添加合计行
        /// 2019-04-02
        /// </summary>
        /// <param name="dataTable"></param>
        public static void AddSumRowToDataSource(DataTable dataTable)
        {
            if (dataTable == null || dataTable.Rows.Count == 0)
            {
                return;
            }
            DataRow sumRow = dataTable.NewRow();
            foreach (DataColumn item in dataTable.Columns)
            {
                try
                {
                    string typeName = item.DataType.Name;
                    switch (typeName)
                    {
                        case "Decimal":
                            sumRow[item] = dataTable.AsEnumerable().Sum(e => e.Field<decimal>(item)).ToString("N2");
                            break;
                        case "Int":
                            sumRow[item] = dataTable.AsEnumerable().Sum(e => e.Field<int>(item)).ToString("N2");
                            break;
                        case "Double":
                            sumRow[item] = dataTable.AsEnumerable().Sum(e => e.Field<double>(item)).ToString("N2");
                            break;
                        case "String":
                            sumRow[item] = dataTable.AsEnumerable().Sum(e => Convert.ToDecimal(e.Field<string>(item))).ToString("N2");
                            break;
                        default:
                            break;
                    }

                }
                catch
                {
                    continue;
                }
            }
            sumRow[0] = "合计";
            dataTable.Rows.Add(sumRow);
        }


        /// <summary>
        /// 添加合计行
        /// 2019-04-02
        /// </summary>
        /// <param name="dataSource"></param>
        public static void AddSumRowToDataSource<T>(List<T> dataSource) where T : new()
        {
            if (dataSource == null || dataSource.Count() == 0)
            {
                return;
            }
            T sumItem = new T();//创建一个对象,用来存合计的值
            Type type = sumItem.GetType(); //对象类型
            IEnumerable<System.Reflection.PropertyInfo> properties = from pi in type.GetProperties() select pi;  //获取此对象所有的属性
            foreach (System.Reflection.PropertyInfo propertyInfo in properties)
            {//对每个属性尝试合计,如果能合计就跳过
                try
                {
                    decimal sumValue = dataSource.Sum(e =>
                    {
                        Type etype = e.GetType();
                        IEnumerable<System.Reflection.PropertyInfo> eproperty = from pi in etype.GetProperties() where pi.Name == propertyInfo.Name select pi;
                        return Convert.ToDecimal(eproperty.First().GetValue(e, null));
                    });
                    propertyInfo.SetValue(sumItem, sumValue);
                }
                catch
                {
                    continue;
                }
            }
            dataSource.Add(sumItem);
        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值