扩展方法(2) GridView单元格合并

大家GridView都用的比较多吧..有没遇到单元格需要合并的需求..

单元格合并原理其实很简单,就是逐行判断要合并的单元格里的值是否和上一行的相同,要是相同的 话就合并,不同的话就接着判断

我们可以通过扩展方法为GridView添加单元合并

 public static class GridViewExtensions
     {
         /// <summary>
         ///  GridView行合并
         /// </summary>
         /// <param name="gridView"></param>
         /// <param name="field">合并参数(匿名类型)
         /// ColumnIndex:要合并行的索引 (以0开始,必须指定)
         /// ID(可选):如果该行为模板行则必须指定
         /// PropertyName:根据ID属性 默认值为Text
         /// Colums:(string类型)表示额外的行合并方式和ColumnIndex一样(多个使用逗 号隔开,如Colums="5,6,7,8")
         /// 例:
         /// 合并第一行(第一行为模板行),绑定的一个Label名称为lblName  根据Text 属性值合并  第6行方式和第一行相同
         /// new {ColumnIndex=0,ID="lblName",PropertyName="Text",Columns="5"}
         /// </param>
         public static GridView RowSpan(this GridView gridView, object  field)
         {
             Dictionary<string, string> rowDictionary =  ObjectLoadDictionary(field);
             int columnIndex = int.Parse(rowDictionary["ColumnIndex"]);
             string columnName = rowDictionary["ColumnName"];
             string propertyName = rowDictionary["PropertyName"];
             string columns = rowDictionary["Columns"];
             for (var i = 0; i < gridView.Rows.Count; i++)
             {

                 int rowSpanCount = 1;
                 for (int j = i + 1; j < gridView.Rows.Count;  j++)
                 {
                     //绑定行合并处理
                     if (string.IsNullOrEmpty(columnName))
                     {
                         //比较2行的值是否相同
                         if (gridView.Rows[i].Cells [columnIndex].Text == gridView.Rows[j].Cells[columnIndex].Text)
                         {
                             //合并行的数量+1
                             rowSpanCount++;
                             //隐藏相同的行
                             gridView.Rows[j].Cells [columnIndex].Visible = false;
                             if (!string.IsNullOrEmpty (columns))
                             {
                                 columns.Split (',').ToList<string>().ForEach(c => gridView.Rows[j].Cells[int.Parse (c)].Visible=false);
                             }
                         }
                         else
                         {
                             break;
                         }
                     }
                     else
                     {
                         //模板行的合并处理
                         if (GetPropertyValue(gridView.Rows [i].Cells[columnIndex].FindControl(columnName), propertyName) == GetPropertyValue (gridView.Rows[j].Cells[columnIndex].FindControl(columnName), propertyName))
                         {
                             rowSpanCount++;
                             //隐藏相同的行
                             gridView.Rows[j].Cells [columnIndex].Visible = false;
                             if (!string.IsNullOrEmpty (columns))
                             {

                                 columns.Split (',').ToList<string>().ForEach(c => gridView.Rows[j].Cells[int.Parse(c)].Visible  = false);
                             }
                         }
                         else
                         {
                             break;
                         }
                     }
                 }
                 if (rowSpanCount > 1)
                 {
                     //行合并
                     gridView.Rows[i].Cells[columnIndex].RowSpan =  rowSpanCount;
                     //判断是否有额外的行需要合并
                     if (!string.IsNullOrEmpty(columns))
                     {
                         //额外的行合并
                         columns.Split(',').ToList<string> ().ForEach(c => gridView.Rows[i].Cells[int.Parse(c)].RowSpan = rowSpanCount);
                     }
                     i = i + rowSpanCount - 1;
                 }

             }
             return gridView;
         }

         private static Dictionary<string, string> ObjectLoadDictionary (object fields)
         {
             Dictionary<string, string> resultDictionary = new  Dictionary<string, string>();
             PropertyInfo[] property = fields.GetType().GetProperties (BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public |  BindingFlags.GetProperty);
             foreach (PropertyInfo tempProperty in property)
             {
                 resultDictionary.Add(tempProperty.Name,  tempProperty.GetValue(fields, null).ToString());
             }
             //指定默认值
             if (!resultDictionary.Keys.Contains("ColumnIndex"))
             {
                 throw new Exception("未指定要合并行的索引 ColumnIndex  属性!");
             }
             if (!resultDictionary.Keys.Contains("ColumnName"))
             {
                 resultDictionary.Add("ColumnName", null);
             }

             if (!resultDictionary.Keys.Contains("PropertyName"))
             {
                 resultDictionary.Add("PropertyName", "Text");
             }

             if (!resultDictionary.Keys.Contains("Columns"))
             {
                 resultDictionary.Add("Columns", null);
             }
             return resultDictionary;
         }

         /// <summary>
         ///  获取一个对象的一个属性..
         /// </summary>
         /// <param name="obj"></param>
         /// <param name="PropertyName">属性名称</param>
         /// <returns>属性的值,  如果无法获取则返回 null</returns>
         private static object GetPropertyValue(object obj, string  PropertyName)
         {
             PropertyInfo property = obj.GetType().GetProperty (PropertyName);

             return property.GetValue(obj,null);
         }
     }

时间: 2024-08-22 14:49:13

扩展方法(2) GridView单元格合并的相关文章

ASP.NET中如何动态合并GridView单元格?

问题描述 ASP.NET中如何动态合并GridView单元格? 如何将签到员工.所属部门.所属机构合并 解决方案 参考: http://blog.csdn.net/q107770540/article/details/7010526 解决方案二: http://www.educity.cn/develop/688297.html http://blog.csdn.net/energeticsunxiaocong/article/details/8505346

ExtJS 4.2 Grid组件单元格合并的方法_extjs

ExtJS 4.2 Grid组件本身并没有提供单元格合并功能,需要自己实现这个功能. 目录 1. 原理 2. 多列合并 3. 代码与在线演示 1. 原理 1.1 HTML代码分析 首先创建一个Grid组件,然后查看下的HTML源码. 1.1.1 Grid组件 1.1.2 HTML代码 从这些代码中可以看出,Grid组件可分为grid-header和grid-body 两块区域(若含有工具栏和分页栏,它们都会含有各自的独立区域). 其中grid-body包含了许多tr元素,每一个tr都是代表Gri

poi 导出exce表格,合并的单元格合并单元格office 2010不兼容

问题描述 最进在做一个项目,需要用到比较复杂的excel导出,但是导出后使用Office2003,2007以及wps打开均没有问题.但是在使用office2010打开的时候发现有些单元格合并不对.请问各位有没有遇到过类似的问题呢?这一个是2007的:这个是用2010打开的:提前谢谢各位兄弟. 解决方案 解决方案二:2010--貌似这个考虑的太长远了,如果不行,换个别的工具试试吧解决方案三:引用1楼coolbamboo2008的回复: 2010--貌似这个考虑的太长远了,如果不行,换个别的工具试试

excel公式把100单元格合并起来

  如果需要把A1:A2的内容合并起来,可以用公式 =A1&A2 如果需要把A1:A3的内容合并起来,可以用公式 =A1&A2&A3 如果把A1:A100的单元格合并起来呢? =A1&A2&A3... 公式太长了... 其实....不需要这样的.有一个神秘的函数可以帮我们解决: =PHONETIC(A1:A100) 利用phonetic函数就可以把前100行的内容连接到一起了. 如果,你在每个字符中间加个分隔号,如",",那就增加一个辅助列,在输

OpenXml 单元格合并后Word打开提示错误

问题描述 OpenXml 单元格合并后Word打开提示错误 string path = @"D:newdoc.docx" ; WordprocessingDocument doc = WordprocessingDocument.Create(path, WordprocessingDocumentType.Document) MainDocumentPart mainpart = doc.AddMainDocumentPart(); mainpart.Document = new D

Devexpresss 的Xtrareport 内容单元格合并问题

问题描述 Devexpresss 的Xtrareport 内容单元格合并问题 我知道: Xtrareport 里面的单元格属性可以设置成:processDuplicatesMode:merge这样就可以使某一列相同的数据的值 合并. 如果我想 在第一次合并的结果集中再二次合并呢? 举个例子 ID Name1 as1 as2 as2 as想得到如下的结果: 1 | as--|---2 |as 而不是: 1 | --| AS2 | 谢谢大家!怎么做?

设置单元格的值- 如何实现设置GridView单元格的值?双击显示√,再双击显示为空

问题描述 如何实现设置GridView单元格的值?双击显示√,再双击显示为空 关于设置GridView单元格的值,双击该单元格显示√,再双击一次,显示为空. 如何实现? 主要是做多属性的选择这样的操作,不想用checkbox实现.

openxml-OpenXml 单元格合并后Word打开提示错误

问题描述 OpenXml 单元格合并后Word打开提示错误 public static OutputStream creatWord(ArrayList<String> imageUrllist,String[] names,OutputStream os) { int imageSize = imageUrllist.size(); try { //word模板的路径 CustomXWPFDocument doc = new CustomXWPFDocument(new FileInputS

flex AdvancedDataGrid 实现单元格合并行(或者其他方法能实现)求助大神!!!

问题描述 flex AdvancedDataGrid 实现单元格合并行(或者其他方法能实现)求助大神!!! 解决方案 2013.12.04 JS实现单元格的合并Javascript实现合并单元格使用XtraGrid实现合并单元格 解决方案二: 额,虽然都用不上,但还是谢谢你!