`

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);
}
分享到:
评论

相关推荐

    wpf GridView 合并单元格 Demo

    -- 添加样式以跨行显示 --&gt; &lt;!-- 同样处理Column2 --&gt; ``` 这里我们使用了`FirstItemHeaderVisibilityConverter`转换器,当遇到同一组的第一个元素时,使Header可见。这个转换器需要你自己...

    GridView中单元格合并

    "GridView中单元格合并"这个主题涉及到如何在GridView中实现类似Excel或HTML表格中的跨行或跨列效果,以更加直观、有组织的方式展示数据。 首先,我们来理解一下单元格合并的基本概念。在传统的表格布局中,每个...

    DevExpress 编辑GridControl中合并单元格

    对于行合并,可以通过`GridView.OptionsView.AllowRowMerge`属性开启,并使用`GridView.GetMergeStatus`方法检查特定单元格的合并状态。列头合并则可通过`GridView.OptionsView.ColumnHeadersMergeMode`控制。 4. *...

    gridview 单元格合并源代码

    描述中提到的“GrivView中的单元格合并,类似于HTML中的跨行或跨列合并单元格”,暗示我们将借鉴HTML表格(`&lt;table&gt;`)中的`rowspan`和`colspan`属性概念。在HTML中,`rowspan`用于指定一个单元格跨过的行数,而`...

    WPF GridControl 单元格合并

    - 应用样式和触发器以根据特定条件合并单元格。 - 可能会涉及共享大小组的设置,以实现列合并。 - 示例可能还包含了如何处理数据绑定和事件处理,以便动态响应数据变化并更新单元格合并。 为了深入学习这个主题,...

    GridView合并单元格

    1. **初始化变量**:定义了两个整型变量`i`和`rowSpanNum`,其中`i`用于遍历`GridView`的行,`rowSpanNum`用于记录当前单元格应跨行的数量。 2. **遍历行**:使用`while`循环遍历`GridView`的所有行,除了最后一行...

    Devexpress Gridcontrol 合并行,列头

    1. **行合并**:在GridControl中,可以通过设置`GridView.OptionsView.AllowRowMerge`属性为`true`来启用行合并功能。然后,通过`GridView.MergeCells(int firstVisibleColumn, int lastVisibleColumn, int firstRow...

    GridView控件行和列的合并

    行的合并通常发生在数据有分组或者需要显示跨行信息时。在GridView中,行的合并需要用到TemplateField,并结合.RowStyle属性来实现。以下是一个简单的例子: 1. 首先,在GridView的定义中,我们需要创建一个...

    ASP.NET 2.0中合并 GridView 的表头单元格

    这样,当页面加载时,GridView的表头将显示一个名为“学生成绩”的合并单元格,涵盖所有课程成绩的列。这使得用户可以更直观地理解表格的内容,提高了界面的可读性。 总结起来,合并ASP.NET 2.0中GridView的表头...

    jqgrid合并单元格.rar

    本压缩包“jqgrid合并单元格.rar”提供了一个解决方案,用于在jqGrid中实现单元格的合并,包括行合并和列合并,使得数据展示更为清晰、有组织。 首先,jqGrid的单元格合并功能主要通过设置表格的colModel属性和grid...

    dev_GridView多表头合并.rar

    2. **合并单元格**:使用GridView的`HeaderRow.Cells[i].MergeWith(nextCell)`方法来合并相邻的单元格。这个方法将当前单元格与下一个单元格合并,使得它们显示为一个大的单元格。合并时需注意,合并后的单元格应该...

    合并单元格

    描述中提到的GridView的工作原理,即在数据绑定过程中逐行构造,分为创建行和绑定行两个步骤,这为理解如何合并单元格提供了背景知识。 在ASP.NET中,GridView是一个常用的用于显示和编辑数据的Web控件。在GridView...

    GridView单元格合并

    2. **实现逻辑**:从第一行到最后一行循环,对每行的指定列的单元格进行比较,如果相同则隐藏该单元格,并增加上一个单元格的跨行数(`RowSpan`)。 3. **注意事项**:需要验证传入的参数是否合理,确保不会越界,并且...

    一个基于GridView实现的多列表头合并显示的用户控件程序例子

    2. **设置Cell的MergeAttributes**:对于需要合并的单元格,我们需要设置其`MergeAttributes`属性,添加CSS样式来实现跨行或跨列的效果。例如,可以设置`rowspan`和`colspan`属性,使其跨越多个行或列。 3. **处理...

    GridView创建表头,合并表头列代码

    4. **添加第二个表头单元格并设置跨行** ```csharp tcHeader.Add(new TableHeaderCell()); tcHeader[1].RowSpan = 2; tcHeader[1].Text = "表头"; ``` 这段代码创建了一个新的表头单元格,并设置其跨越2行,...

    GridView动态创建列头丶自定义多行合并表头

    // 添加第一列,设置跨行属性 tcHeader.Add(new TableHeaderCell()); tcHeader[0].Attributes.Add("rowspan", "2"); tcHeader[0].Text = ""; // 可以替换为实际需要的文本 int cols = 1; // 记录当前添加到第...

    合并GRIDVIEW的表头

    - 对于需要跨行显示的单元格,我们通过`Attributes.Add("rowspan", "2")`来指定其跨行数为2。 - 对于需要跨列显示的单元格,我们通过`Attributes.Add("colspan", "3")`来指定其跨列数为3。 4. **设置文本内容**:...

    asp.net中GridView和DataGrid相同列合并实现代码

    在***开发中,有时需要在GridView或DataGrid...以上知识点涵盖了***中GridView和DataGrid控件如何实现相同列合并单元格的基本原理和代码实现,读者可以根据具体的业务场景和数据结构需求来适当调整代码逻辑和应用时机。

    asp.net合并表头,实现多行表头

    每个单元格可以通过`Attributes.Add()`方法添加样式和属性,如`rowspan`、`colspan`以及背景颜色等,以实现单元格的跨行和合并。 第一行的第一个单元格设置`rowspan`为2,表示这个单元格会跨过两行,第二个单元格...

Global site tag (gtag.js) - Google Analytics