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);
}
posted @ 2009-07-12 19:04  heros  阅读(1944)  评论(2编辑  收藏  举报