阿赛·游梦鱼·郭言赛·阿赛工作室
全站技术源码素材

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

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

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

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

     public static class GridViewExtensions
         {
             /// 
             ///  GridView行合并
             /// 
             /// 
             /// 合并参数(匿名类型)
             /// ColumnIndex:要合并行的索引 (以0开始,必须指定)
             /// ID(可选):如果该行为模板行则必须指定
             /// PropertyName:根据ID属性 默认值为Text
             /// Colums:(string类型)表示额外的行合并方式和ColumnIndex一样(多个使用逗 号隔开,如Colums="5,6,7,8")
             /// 例:
             /// 合并第一行(第一行为模板行),绑定的一个Label名称为lblName  根据Text 属性值合并  第6行方式和第一行相同
             /// new {ColumnIndex=0,
             /// 
             public static GridView RowSpan(this GridView gridView, object  field)
             {
                 Dictionary 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               {

                     int rowSpanCount = 1;
                     for (int j = i + 1; 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().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().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 ().ForEach(c => gridView.Rows[i].Cells[int.Parse(c)].RowSpan = rowSpanCount);
                         }
                         i = i + rowSpanCount - 1;
                     }

                 }
                 return gridView;
             }

             private static Dictionary ObjectLoadDictionary (object fields)
             {
                 Dictionary resultDictionary = new  Dictionary();
                 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;
             }

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

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


    MapSiteMapRssGoTop