/// <summary>
///GridViewCellCombine 的摘要说明
/// </summary>
public class GridViewCellCombine
{
    /// <summary>
    /// 目标GridView
    /// </summary>
    GridView _gridView;

/// <summary>
    /// 上一行单元格集
    /// </summary>
    TableCell[] _cells;

/// <summary>
    /// 要合并单元格的列索引集合
    /// </summary>
    int[] _colIndexes;

/// <summary>
    /// 单元格合并相等判断条件
    /// </summary>
    ICellEquality[] _colCellEquality;

/// <summary>
    /// GridView单元格合并辅助类
    /// </summary>
    /// <param name="gridView">目标GridView</param>
    /// <param name="colIndexes">要合并的列的索引号</param>
    public GridViewCellCombine(GridView gridView, int[] colIndexes, ICellEquality[] colCellEquality)
    {
        if (gridView == null)
            throw new Exception("GridView不能为空");

this._gridView = gridView;
        _gridView.RowDataBound += new GridViewRowEventHandler(GridViewRowDataBound);

if (colIndexes != null && colCellEquality != null)//在指定了要合并单元格列及单元格比较器时,列数和比较器数应该一样。
        {
            if (colIndexes.Length != colCellEquality.Length)
            {
                throw new Exception("请为要合并单元格的每一列都添加单元格比较类");
            }
        }

if (colIndexes != null)
        {
            _colIndexes = colIndexes;
            _cells = new TableCell[colIndexes.Length];
        }
        else
        {
            _cells = new TableCell[this._gridView.Columns.Count];
            _colIndexes = Enumerable.Range(0, this._gridView.Columns.Count).ToArray();
        }

if (colCellEquality != null)
        {
            _colCellEquality = colCellEquality;
        }
        else
            _colCellEquality = new ICellEquality[_cells.Length];

}

/// <summary>
    /// GridView行绑定事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void GridViewRowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (_colIndexes != null)
        {
            for (int i = 0; i < _colIndexes.Length; i++)
            {
                //如果上一行该列单元格为空,则从当前行的单元格之后进行比较
                if (_cells[i] == null)
                {
                    _cells[i] = e.Row.Cells[_colIndexes[i]];//把当前单元格引用暂存用于下一行时比较
                    continue;
                }

//如果当前行第_colIndexes[i]列单元格与上一行单元格相等,合并单元格
                if (CellEquals(_cells[i], e.Row.Cells[_colIndexes[i]], _colCellEquality[i]))
                {
                    _cells[i].RowSpan++;
                    if (_cells[i].RowSpan == 1)//RowSpan属性为0 1时都表示不合并
                        _cells[i].RowSpan++;

e.Row.Cells[_colIndexes[i]].Visible = false;
                }
                else
                {
                    _cells[i] = e.Row.Cells[_colIndexes[i]];
                }
            }
        }
    }

/// <summary>
    /// 获取指定位置的单元格
    /// </summary>
    /// <param name="rowIndex"></param>
    /// <param name="colIndex"></param>
    /// <returns></returns>
    private TableCell GetCell(int rowIndex, int colIndex)
    {
        return this._gridView.Rows[rowIndex].Cells[colIndex];
    }

/// <summary>
    /// 单元格相等比较
    /// </summary>
    /// <param name="cell1">cell1</param>
    /// <param name="cell2">cell2</param>
    /// <param name="equality">相等比较器</param>
    /// <returns>返回是否相等</returns>
    private bool CellEquals(TableCell cell1, TableCell cell2, ICellEquality equality)
    {
        bool result = false;
        if (equality == null)//如果比较器为空采用默认比较器
        {
            result = DefaultCellEquality.Entity.CellEquals(cell1, cell2);
        }
        else
        {
            result = equality.CellEquals(cell1, cell2);
        }

return result;
    }

/// <summary>
    /// 单元格默认比较类
    /// </summary>
    class DefaultCellEquality : ICellEquality
    {
        /// <summary>
        /// 默认的单元格相等比较器,用单元格内的文字进行比较
        /// </summary>
        public static DefaultCellEquality Entity = new DefaultCellEquality();

#region ICellEquality 成员

/// <summary>
        /// 比较方法
        /// </summary>
        /// <param name="cell1">cell1</param>
        /// <param name="cell2">cell2</param>
        /// <returns>是否相等</returns>
        public bool CellEquals(TableCell cell1, TableCell cell2)
        {
            if (cell1 == null || cell2 == null)
                return false;
            return cell1.Text.Equals(cell2.Text);//根据单元格内容比较
        }

#endregion
    }
}

/// <summary>
/// 单元格相等比较器
/// </summary>
public interface ICellEquality
{
    /// <summary>
    /// 比较两个单元格是否相等
    /// </summary>
    /// <param name="cell1">单元格1</param>
    /// <param name="cell2">单元格2</param>
    /// <returns>返回是否相等</returns>
    bool CellEquals(TableCell cell1, TableCell cell2);
}

转载于:https://www.cnblogs.com/heros/archive/2009/07/12/1522053.html

GridView跨行合并单元格相关推荐

  1. GridView中合并单元格

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Da ...

  2. HTML5+CSS3网页设计从基础到入门——合并单元格

    一,合并单元格的方式 跨行合并:rowspan="合并单元格的个数" 跨列合并:colspan="合并单元格的个数"                      ...

  3. bootstraptable合并标题_bootstrapTable 合并单元格

    /** * 合并单元格 * @param data 原始数据(在服务端完成排序) * @param fieldName 合并属性名称 * @param colspan 合并列 * @param tar ...

  4. html语言的td合并,table标签合并单元格(包括行和列的合并)的方法

    刘代码已经在table标签的使用方法中介绍过该标签的一些具体用法,但这次,我们要讲解的是如何合并table表格中的单元格,包括行的合并以及列的合并方法 table表格单元格的合并,主要分为两种:跨行合 ...

  5. poi word操作之XWPFTable合并单元格

    poi word操作之XWPFTable合并单元格 需要注意,要合并的单元格最好不要有其他的合并样式. 跨列合并单元格 /** * @Description: 跨列合并 * table要合并单元格的表 ...

  6. java创建excel(不用设置样式,支持xlsx、xls格式, 不支持合并单元格)

    推荐:java 读取excel(支持xlsx.xls格式, 支持合并单元格) java写excel 实现效果 实现思路 基本概念 依赖 对外提供的方法 内部方法 代码实现 测试代码 ExcelWrit ...

  7. GridView、Repeater合并单元格

    GridView.Repeater合并单元格 对于GridView.Repeater生成的表格一般都比较固定,但是有时候我们为了报表统计方便常把列名一样的单元格合并以达到易观察统计的效果,这样我们就需 ...

  8. GRIDVIEW多行多列合并单元格(合并列)

    GitHub项目地址:https://github.com/mingceng/merge-gridviewcell 去年的时候,我写了两篇文章:  GridView多行多列合并单元格(完整代码和例子) ...

  9. csstable跨列居中_html中table表格如何跨行或跨列合并单元格

    在html中的table表格实现跨行或跨列合并单元格,需要用到以下两个属性: 1.跨列colspan属性:就是合并左右关系的单元格: 2.跨行rowspan属性:就是合并上下关系的单元格: 而在tab ...

最新文章

  1. 【Spring】工厂模式解耦
  2. 众人评说《我们在微软怎样开发(英文版)》
  3. 邬贺铨院士:十问边缘计算!
  4. 智能车竞赛:提问与回答
  5. [笔记]modelsim前仿后仿各种问题
  6. 没有 root 权限如何使用 pip?How to install python modules without root access?
  7. 第一次在Django上编写静态网页
  8. Android学习笔记(三)——Button之圆角、按压效果、点击事件
  9. Spring Cloud OAuth2 实现用户认证及单点登录
  10. 2012中国移动社交游戏市场盈利模式探讨
  11. hdu 1754 线段树(点修改)
  12. jvisualVM调优案例
  13. 黄绿色——五色配色篇
  14. 深度学习常用资料整理
  15. http(S)系列之(五):android之HttpURLConnection源码解析(1)
  16. bzoj 4008 亚瑟王 - 动态规划 - 概率与期望
  17. 7、8系升9系视频教程
  18. 安卓手机修改音量键为HOME和BACK
  19. 图片太大怎么压缩变小?压缩有技巧
  20. 明明有本事,为什么难升职?

热门文章

  1. 在用数据绑定的时候我为什么不能把焦点移出(Tab out)我的控件?(译)
  2. 日报 18/06/04
  3. iOS:ShareSDk的分享
  4. bool在哪个头文件_Java里的 for (;;) 与 while (true),哪个更快?
  5. 3690状态压缩+暴力
  6. POJ3228二分最大流
  7. 【Linux 内核】进程管理 task_struct 结构体 ④ ( comm 字段 | 进程优先级字段 | cpus_ptr 字段 | mm、active_mm 字段 | fs 字段 )
  8. 【数字信号处理】相关函数 ( 相关系数与相关函数 | 相关函数定义 )
  9. 【数字信号处理】线性常系数差分方程 ( “ 线性常系数差分方程 “ 与 “ 线性时不变系统 “ 关联 | 根据 “ 线性常系数差分方程 “ 与 “ 边界条件 “ 确定系统是否是 线性时不变系统方法 )
  10. 【Flutter】监听滚动动作 控制组件 透明度渐变 ( 移除顶部状态栏空白 | 帧布局组件 | 透明度组件 | 监听滚动组件 )