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