您的位置:首页 > 产品设计 > UI/UE

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

2016-10-21 18:37 761 查看
原文地址: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() {

}


效果图如下:

未合并



合并

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐