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(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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章