easyui-datagrid合并列 C#使用Dynamic泛型计算合并列数据

原文地址:http://blog.csdn.net/gzy11/article/details/52885776

easy官方文档,这么写的。。easyui-datagrid的和并列需要如下数据格式数据:偷懒了,直接把官方的搬过来。自己看吧。

        Merge some cells to one cell, the options contains following properties:
        index: the row index.
        type: the row type, possible values are 'body','footer'.
        field: the field name.
        rowspan: the rowspan count to be merged.
        colspan: the colspan count to be merged.
        Code example:

        // merge the footer rows
        $('#dg').datagrid('mergeCells', {
	        index: 1,
	        field: 'name',
	        colspan: 2,
	        type: 'footer'
        });

C#代码主要使用了Nuget中的 System.Linq.Dynamic( 是个开源项目)。该版本目前只实现了实体类字段全部为string类型,其他类型暂不支持。

代码如下:

版本1.0.0.0

所需命名空间:别忘了nuget中的System.Linq.Dynamic项目

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Linq.Dynamic;
using System.Text.RegularExpressions;

    public class Merges
    {
        /// <summary>
        /// 字段
        /// </summary>
        public string field { get; set; }
        public List<Merge> MergeList { get; set; }

    }
    /// <summary>
    /// 适用easyui 合并行及列
    /// </summary>
    public class Merge
    {
        /// <summary>
        /// 索引
        /// </summary>
        public int index { get; set; }

        /// <summary>
        /// 行合并
        /// </summary>
        public int rowspan { get; set; }

        /// <summary>
        /// 列合并
        /// </summary>
        public int colspan { get; set; }

        /// <summary>
        /// 字段
        /// </summary>
        public string field { get; set; }

        /// <summary>
        /// 类型
        /// </summary>
        public string type { get; set; }
    }

合并执行类

 /*  easyui字段适用说明   *
        Merge some cells to one cell, the options contains following properties:
        index: the row index.
        type: the row type, possible values are 'body','footer'.
        field: the field name.
        rowspan: the rowspan count to be merged.
        colspan: the colspan count to be merged.
        Code example:

        // merge the footer rows
        $('#dg').datagrid('mergeCells', {
	        index: 1,
	        field: 'name',
	        colspan: 2,
	        type: 'footer'
        });
     * */

    /// <summary>
    /// 公共和并列
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ViewMergesData<T> where T : new()
    {

        public List<Merges> Merges { get; set; }
        public List<T> Data { get; set; }

        /// <summary>
        /// 追加,后续优化是否去掉。
        /// </summary>
        /// <param name="merges"></param>
        public void Append(Merges merges)
        {

            if (Merges == null)
            {
                Merges = new List<Merges>();
            }
            var m = Merges.Where(p => p.field == merges.field).ToList();
            if (m.Count > 0)
            {
                //int len = merges.MergeList.Count;
                foreach (var item in merges.MergeList)
                {
                    int index = m[0].MergeList.Last().index + m[0].MergeList.Last().rowspan;
                    m[0].MergeList.Add(new Merge() { field = merges.field, index = index, rowspan = item.rowspan });
                }
            }
            else Merges.Add(merges);

        }
        /// <summary>
        /// 处理合并数据
        /// </summary>
        /// <param name="fieldList"></param>
        public void MergeData(List<string> fieldList)
        {
            MergeNode(fieldList);
        }

        /// <summary>
        /// 获取合并节点--该方法待优化
        /// </summary>
        /// <param name="dataSoure">数据源</param>
        /// <param name="groupField"></param>
        private void MergeNode(List<string> fieldList, List<T> dataSoure = null, string groupField = null, MergeField mergeField = null, int next = 0)//, string where=null, string whereParams)
        {
            if (string.IsNullOrWhiteSpace(groupField))
                groupField = fieldList[0];
            if (dataSoure == null)
                dataSoure = this.Data;

            Merges merges = new ViewModel.Merges() { field = groupField };

            var selectList = dataSoure.Select(groupField, groupField);

            var result = (dataSoure.GroupBy(groupField, groupField) as System.Collections.Generic.IEnumerable<System.Linq.IGrouping<string, string>>);

            if (result == null)
                return;
            int i = 0;
            foreach (var item in result)
            {
                Merge merge = new ViewModel.Merge();

                merge.field = groupField;//item.Key;
                if (merges.MergeList == null)
                {
                    merges.MergeList = new List<Merge>();
                    merge.index = 0;
                }
                else
                {
                    //var tt = this.Merges.Where(p => p.field == groupField).ToList();
                    //int index = Convert.ToInt32(this.Merges.Where(p => p.field == groupField).Select(p => (p.MergeList.Last().index + p.MergeList.Last().rowspan)).ToString());
                    merge.index = merges.MergeList[i - 1].index + merges.MergeList[i - 1].rowspan;
                }

                merge.rowspan = item.Count();
                merges.MergeList.Add(merge);
                i++;
                //递归准备

                string field = GetNextGroupField(fieldList, groupField);
                if (string.IsNullOrWhiteSpace(field))
                {
                    continue;
                }
                if (next == 0)
                {
                    //next = 0;
                    mergeField = new MergeField();
                    mergeField.Where += groupField + "=@" + next;
                    mergeField.Params = new List<string>();
                    mergeField.Params.Add(item.Key);
                }
                else
                {
                    if (!mergeField.Where.Contains(groupField))
                    {
                        mergeField.Where += " AND " + groupField + "=@" + next;
                        mergeField.Params.Add(item.Key);
                    }
                    else
                    {


                        var splitResult = Regex.Split(mergeField.Where, "AND", RegexOptions.None);

                        for (int k = 0; k < splitResult.Length; k++)
                        {
                            if (splitResult[k].Contains(groupField))
                            {
                                next = k;
                                break;
                            }
                        }
                        int lastIndex = mergeField.Where.IndexOf(groupField);
                        mergeField.Where = mergeField.Where.Substring(0, lastIndex);
                        mergeField.Where += " " + groupField + "=@" + next;
                        int len = splitResult.Length - next;
                        for (int j = len; j > 0; j--)
                        {
                            mergeField.Params.RemoveAt(j);
                        }

                        mergeField.Params.Add(item.Key);
                        //next = mergeField.Params.Count - 1;
                    }

                }

                dataSoure = GetSoure(mergeField);
                if (dataSoure != null)
                    MergeNode(fieldList, dataSoure, field, mergeField, next + 1);

            }
            this.Append(merges);
            // return merges;
        }
        /// <summary>
        /// 获取数据源
        /// </summary>
        /// <param name="dataSoure"></param>
        /// <param name="where"></param>
        /// <param name="whereParams"></param>
        /// <returns></returns>
        private List<T> GetSoure(MergeField mergeField)
        {
            return this.Data.Where(mergeField.Where, mergeField.Params.ToArray()).ToList();
        }
        /// <summary>
        /// 根据字段
        /// </summary>
        /// <param name="fieldList"></param>
        /// <param name="field"></param>
        /// <returns></returns>
        private string GetNextGroupField(List<string> fieldList, string field)
        {
            int len = fieldList.Count;
            for (int i = 0; i < len; i++)
            {
                if (fieldList[i] == field && i + 1 < len)
                {
                    return fieldList[i + 1];
                }
            }
            return null;
        }

    }

其中
  List<string> field = new List<string>();
            field.Add("CreateTime");
            field.Add("CompanyName");
            field.Add("ChannelName");
            field.Add("ListVolume");
            field.Add("BtnClick");
这个是指定合并的顺序。
调用所需实体类ViewParityOrderStatisticalList
 public class ViewParityOrderStatisticalList
    {
        private DateTime? _createtime;
        /// <summary>
        /// 创建时间
        /// </summary>
        public string CreateTime
        {
            set
            {
                if (!string.IsNullOrWhiteSpace(value))
                {
                    _createtime = Convert.ToDateTime(value);
                }
            }
            get
            {
                if (_createtime != null)
                    return _createtime.Value.ToString("yyyy-MM-dd");
                return null;
            }
            //set { _createtime = value; }
            //get { return _createtime; }
        }

        /// <summary>
        /// 渠道来源
        /// </summary>
        public string Channel
        {
            set;
            get;
        }
        /// <summary>
        /// 渠道名称
        /// </summary>
        public string ChannelName
        {
            set;
            get;
        }

        /// <summary>
        /// 公司名称
        /// </summary>
        public string CompanyName { get; set; }

        /// <summary>
        /// 底价车险PV
        /// </summary>
        public string DiJia_PV { get; set; }

        /// <summary>
        /// 比价点击量
        /// </summary>
        public string ParityPV { get; set; }
        /// <summary>
        /// 名单量
        /// </summary>
        public int ListVolume { get; set; }

        /// <summary>
        /// 按钮点击率
        /// </summary>
        public string BtnClick { get; set; }

    }

调用如下
  List<ViewParityOrderStatisticalList> list = new List<ViewParityOrderStatisticalList>();
            int length = 3;
            for (int i = 0; i < length; i++)
            {
                if (i == 2)
                    list.Add(new ViewParityOrderStatisticalList() { CreateTime = DateTime.Now.ToString("yyyy-MM-dd"), BtnClick = "20%", ChannelName = "测试", CompanyName = "飞利浦" + (i - 1), ListVolume = i, ParityPV = i.ToString(), DiJia_PV = i.ToString() });
                else
                    list.Add(new ViewParityOrderStatisticalList() { CreateTime = DateTime.Now.ToString("yyyy-MM-dd"), BtnClick = "20%", ChannelName = "测试", CompanyName = "飞利浦" + i, ListVolume = i, ParityPV = i.ToString(), DiJia_PV = i.ToString() });
            }
            length = 2;
            for (int i = 0; i < length; i++)
            {
                if (i == 1)
                    list.Add(new ViewParityOrderStatisticalList() { CreateTime = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd"), BtnClick = "20%", ChannelName = "测试", CompanyName = "飞利浦" + (i - 1), ListVolume = i, ParityPV = i.ToString(), DiJia_PV = i.ToString() });
                else
                    list.Add(new ViewParityOrderStatisticalList() { CreateTime = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd"), BtnClick = "20%", ChannelName = "测试", CompanyName = "飞利浦" + i, ListVolume = i, ParityPV = i.ToString(), DiJia_PV = i.ToString() });
            }
            length = 5;
            for (int i = 0; i < length; i++)
            {
                if (i == 1)
                    list.Add(new ViewParityOrderStatisticalList() { CreateTime = DateTime.Now.AddDays(2).ToString("yyyy-MM-dd"), BtnClick = "20%", ChannelName = "测试", CompanyName = "飞利浦" + (i - 1), ListVolume = i, ParityPV = i.ToString(), DiJia_PV = i.ToString() });
                else
                    list.Add(new ViewParityOrderStatisticalList() { CreateTime = DateTime.Now.AddDays(2).ToString("yyyy-MM-dd"), BtnClick = "20%", ChannelName = "测试", CompanyName = "飞利浦" + i, ListVolume = i, ParityPV = i.ToString(), DiJia_PV = i.ToString() });
            }
            length = 4;
            for (int i = 0; i < length; i++)
            {
                if (i == 2)
                    list.Add(new ViewParityOrderStatisticalList() { CreateTime = DateTime.Now.AddDays(3).ToString("yyyy-MM-dd"), BtnClick = "20%", ChannelName = "测试", CompanyName = "飞利浦" + (i - 1), ListVolume = i, ParityPV = i.ToString(), DiJia_PV = i.ToString() });
                else
                    list.Add(new ViewParityOrderStatisticalList() { CreateTime = DateTime.Now.AddDays(3).ToString("yyyy-MM-dd"), BtnClick = "20%", ChannelName = "测试", CompanyName = "飞利浦" + i, ListVolume = i, ParityPV = i.ToString(), DiJia_PV = i.ToString() });
            }
            ViewMergesData<ViewParityOrderStatisticalList> viewMergesData = new ViewMergesData<ViewParityOrderStatisticalList>();
            viewMergesData.Data = list;
            List<string> field = new List<string>();
            field.Add("CreateTime");
            field.Add("CompanyName");
            field.Add("ChannelName");

            field.Add("ListVolume");
            field.Add("BtnClick");

            viewMergesData.MergeData(field);

easyUI-griddata JS如下:

        <table id="dataGrid" class="easyui-datagrid" style="width:100%;height:900px"
               data-options="
                rownumbers: true,
                singleSelect: true,
                //iconCls: 'icon-save',
                //url: 'QueryStatisticalList',
                loadMsg:'数据加载中,请稍后...',
                method: 'post',
                onLoadSuccess: onLoadSuccess,
                onLoadError:onLoadError
            ">
            <thead>
                <tr>
                    <th data-options="field:'CreateTime',width:100">时间</th>
                    <th data-options="field:'CompanyName',width:80">公司</th>
                    <th data-options="field:'ChannelName',width:80,align:'right'">渠道来源</th>
                    <th data-options="field:'PV',width:80,align:'right'">底价车险PV</th>
                    <th data-options="field:'ParityPV',width:80">比价车险PV</th>
                    <th data-options="field:'ListVolume',width:60,align:'center'">名单量</th>
                    <th data-options="field:'BtnClick',width:80,align:'center'">按钮点击率</th>
                </tr>
            </thead>
        </table>


JS部分:

注意mydata部分是序列化json后的Merges对象。

    public class ViewMergesData<T> where T : new()
    {
        public List<Merges> Merges { get; set; }
        public List<T> Data { get; set; }

            var mydata;
            $.ajax({
                type: "post",
                url: "QueryStatisticalList",
                //"http://localhost:33585/InsuranceCity/GetCitiesByRegionID?RegionId=12000""
                dataType: "json",
                success: function (data) {
                    //alert(JSON.stringify(data));
                    if (data.Result) {
                        //$("#dataGrid").datagrid('load', data.Data);
                        mydata = data.Data.Merges;
                        $('#dataGrid').datagrid({ data: data.Data.Data });
                        $('#dataGrid').datagrid('reload');
                    }
                },
                error: function () {
                    alert("数据加载失败");
                }
            });
            function onLoadSuccess(data) {               
                //for (var i = 0; i < mydata.length; i++) {
                //alert(mydata[i].index + " " + mydata[i].rowspan + " " + mydata[i].field);
                alert(JSON.stringify(mydata[0].MergeList));
                for (var i = 0; i < mydata.length; i++) {
                    for (var j = 0; j < mydata[i].MergeList.length; j++) {
                        // alert(JSON.stringify(mydata[i].MergeList[j]));
                        $(this).datagrid('mergeCells', mydata[i].MergeList[j]);
                    }
                }
            }
            function onLoadError() {
                
            }

效果图如下:

未合并

合并




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值