<!--<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);
}
/// 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);
}