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

来源:互联网 发布:叉叉助手最新源码 编辑:程序博客网 时间:2024/05/01 05:04

原文地址: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
原创粉丝点击