GridView跨行合并单元格

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> ///   <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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值