zoukankan      html  css  js  c++  java
  • GridView跨行合并单元格

    /// <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(0this._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);
    }
  • 相关阅读:
    JavaScript-12(事件)
    JavaScript-11(DOM对象)
    JavaScript-10(去重数组)
    js中三元运算符的用法拓展
    JavaScript-5(常见题目-4)
    JavaScript-6(数组的大小排序)
    【CSP-S2019】10.28比赛总结
    【CSP-S2019模拟】10.27比赛总结
    JZOJ6392. 【NOIP2019模拟2019.10.26】僵尸
    【Comet OJ
  • 原文地址:https://www.cnblogs.com/heros/p/1522053.html
Copyright © 2011-2022 走看看