首先我们看下没有设定合并条件的数据
然后我们通过代码,设置按照 ColumnA 和 ColumnB 进行合并
grid.SetCellMerge("ColumnA");
grid.SetCellMerge("ColumnB");
结果如下图
我们进一步设定合并条件,假如我们想 ColumnB 合并的时候要求 ColumnA 列的值必须一致,此时除了调用上面的两行代码设置 ColumnA 和 ColumnB 进行合并外,我们还需要用到一个事件——WnGrid 的原生控件 GridView 的 CellMerge 事件,注册方式如下
grid.GridView.CellMerge += GridView_CellMerge;
然后我们在 GridView_CellMerge 方法里面写代码,来实现我们的条件合并代码如下
private void GridView_CellMerge(object sender, DevExpress.XtraGrid.Views.Grid.CellMergeEventArgs e)
{
if (e.Column.FieldName == "ColumnB")
{
object a1 = grid.GetCellValue(e.RowHandle1,"ColumnA");
object a2 = grid.GetCellValue(e.RowHandle2, "ColumnA");
object b1 = grid.GetCellValue(e.RowHandle1, "ColumnB");
object b2 = grid.GetCellValue(e.RowHandle2, "ColumnB");
e.Merge = a1.Equals(a2) && b1.Equals(b2);
e.Handled = true;
}
}
效果如下
下面我们将对上面的代码进行分析
首先是 if (e.Column.FieldName == "ColumnB")。因为我们需要对 ColmnB 进行条件合并,但是只要设置过合并的列都会触发这个事件,为了防止执行多余的代码或造成结果异常,我们需要添加判断,只处理要进行条件合并的列,其他的合并列不处理;
然后是
object a1 = grid.GetCellValue(e.RowHandle1,"ColumnA");
object a2 = grid.GetCellValue(e.RowHandle2, "ColumnA");
object b1 = grid.GetCellValue(e.RowHandle1, "ColumnB");
object b2 = grid.GetCellValue(e.RowHandle2, "ColumnB");
因为我们要合并的条件是,ColumnA 和 ColunmnB 列的值都相等,所以我们就获取上下相邻两行的 ColumnA 和 ColumnB 列的值进行判段;
到底合不合并通过下面的代码判断
e.Merge = a1.Equals(a2) && b1.Equals(b2);
最后千万不要忘记添加 e.Handled = true;
,如果没有这句代码,该事件的代码将不起作用。