GridView跨行合并单元格
生活随笔
收集整理的這篇文章主要介紹了
GridView跨行合并单元格
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
///?<summary>
///GridViewCellCombine?的摘要說明
///?</summary>
public?class?GridViewCellCombine
{
????///?<summary>
????///?目標(biāo)GridView
????///?</summary>
????GridView?_gridView;
????///?<summary>
????///?上一行單元格集
????///?</summary>
????TableCell[]?_cells;
????///?<summary>
????///?要合并單元格的列索引集合
????///?</summary>
????int[]?_colIndexes;
????///?<summary>
????///?單元格合并相等判斷條件
????///?</summary>
????ICellEquality[]?_colCellEquality;
????///?<summary>
????///?GridView單元格合并輔助類
????///?</summary>
????///?<param?name="gridView">目標(biāo)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)//在指定了要合并單元格列及單元格比較器時,列數(shù)和比較器數(shù)應(yīng)該一樣。
????????{
????????????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++)
????????????{
????????????????//如果上一行該列單元格為空,則從當(dāng)前行的單元格之后進行比較
????????????????if?(_cells[i]?==?null)
????????????????{
????????????????????_cells[i]?=?e.Row.Cells[_colIndexes[i]];//把當(dāng)前單元格引用暫存用于下一行時比較
????????????????????continue;
????????????????}
????????????????//如果當(dāng)前行第_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)//如果比較器為空采用默認(rèn)比較器
????????{
????????????result?=?DefaultCellEquality.Entity.CellEquals(cell1,?cell2);
????????}
????????else
????????{
????????????result?=?equality.CellEquals(cell1,?cell2);
????????}
????????return?result;
????}
????///?<summary>
????///?單元格默認(rèn)比較類
????///?</summary>
????class?DefaultCellEquality?:?ICellEquality
????{
????????///?<summary>
????????///?默認(rèn)的單元格相等比較器,用單元格內(nèi)的文字進行比較
????????///?</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);//根據(jù)單元格內(nèi)容比較
????????}
????????#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>
????///?目標(biāo)GridView
????///?</summary>
????GridView?_gridView;
????///?<summary>
????///?上一行單元格集
????///?</summary>
????TableCell[]?_cells;
????///?<summary>
????///?要合并單元格的列索引集合
????///?</summary>
????int[]?_colIndexes;
????///?<summary>
????///?單元格合并相等判斷條件
????///?</summary>
????ICellEquality[]?_colCellEquality;
????///?<summary>
????///?GridView單元格合并輔助類
????///?</summary>
????///?<param?name="gridView">目標(biāo)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)//在指定了要合并單元格列及單元格比較器時,列數(shù)和比較器數(shù)應(yīng)該一樣。
????????{
????????????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++)
????????????{
????????????????//如果上一行該列單元格為空,則從當(dāng)前行的單元格之后進行比較
????????????????if?(_cells[i]?==?null)
????????????????{
????????????????????_cells[i]?=?e.Row.Cells[_colIndexes[i]];//把當(dāng)前單元格引用暫存用于下一行時比較
????????????????????continue;
????????????????}
????????????????//如果當(dāng)前行第_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)//如果比較器為空采用默認(rèn)比較器
????????{
????????????result?=?DefaultCellEquality.Entity.CellEquals(cell1,?cell2);
????????}
????????else
????????{
????????????result?=?equality.CellEquals(cell1,?cell2);
????????}
????????return?result;
????}
????///?<summary>
????///?單元格默認(rèn)比較類
????///?</summary>
????class?DefaultCellEquality?:?ICellEquality
????{
????????///?<summary>
????????///?默認(rèn)的單元格相等比較器,用單元格內(nèi)的文字進行比較
????????///?</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);//根據(jù)單元格內(nèi)容比較
????????}
????????#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);
}
轉(zhuǎn)載于:https://www.cnblogs.com/heros/archive/2009/07/12/1522053.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的GridView跨行合并单元格的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下Apache并发连接数和带宽
- 下一篇: flash 3D在线游戏