easyui-datagrid合并列 C#使用Dynamic泛型计算合并列数据
2016-10-21 18:37
761 查看
原文地址:http://blog.csdn.net/gzy11/article/details/52885776
easy官方文档,这么写的。。easyui-datagrid的和并列需要如下数据格式数据:偷懒了,直接把官方的搬过来。自己看吧。
C#代码主要使用了Nuget中的 System.Linq.Dynamic( 是个开源项目)。该版本目前只实现了实体类字段全部为string类型,其他类型暂不支持。
代码如下:
版本1.0.0.0
所需命名空间:别忘了nuget中的System.Linq.Dynamic项目
合并执行类
其中
List<string> field = new List<string>();
field.Add("CreateTime");
field.Add("CompanyName");
field.Add("ChannelName");
field.Add("ListVolume");
field.Add("BtnClick");
这个是指定合并的顺序。
调用所需实体类ViewParityOrderStatisticalList
调用如下
easyUI-griddata JS如下:
JS部分:
注意mydata部分是序列化json后的Merges对象。
public class ViewMergesData<T> where T : new()
{
public List<Merges> Merges { get; set; }
public List<T> Data { get; set; }
效果图如下:
未合并
合并
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() { }
效果图如下:
未合并
合并
相关文章推荐
- 【原创】c#讲数据库数据转换为json格式(使用extjs,easyui中的datagrid)
- c#将数据库数据转换为json格式(使用extjs,easyui中的datagrid)
- 使用Jquery EasyUi常见问题解决方案 刷新 easyui datagrid 数据
- EasyUI DataGrid使用Json加载不了数据
- c#中使用easyUI的DataGrid组件
- 在使用easyui,datagrid时,JSON中的如果含有换行符,则不能显示数据
- EasyUI中tree,Datagrid,pagenation的使用EasyUI中Datagrid和pagenation进行关联时,再次点击pagenation时让表格数据显示的问题
- 在使用easyui,datagrid时,JSON中的如果含有换行符,则不能显示数据
- easyUI中的datagrid的formatter方法中 使用$.ajax()方法绑定多个不同数据源的数据
- EasyUI 使用DataGrid并使用分页及复选框,支持格式化数据
- easyui的数据表格(datagrid)使用时formatter的技巧
- 在easyui datagrid中formatter数据后使用linkbutton
- Highcharts使用easyui datagrid的数据画动态统计图
- 使用easyui在ie浏览器下,treegrid,datagrid加载数据很慢,ie浏览器卡住原因
- silverlight3 datagrid c#中动态生成模板列(日期格式)使用IValueConvert对绑定数据的格式化操作
- 在easyui datagrid中formatter数据后使用linkbutton
- 0120如何合并两个使用 System.Xml 使用 Visual C#.NET 的 XML 文档中的数据
- 311530 HOW TO:在 Visual C# .NET 中使用 System.Xml 合并两个 XML 文档中的数据 (From MKBA)
- 在easyui datagrid中formatter数据后使用linkbutton