WinForm/C# WnGrid 条件合并

wangqingjie · 2018年10月25日 · 101 次阅读

首先我们看下没有设定合并条件的数据
1

然后我们通过代码,设置按照 ColumnA 和 ColumnB 进行合并

grid.SetCellMerge("ColumnA");
grid.SetCellMerge("ColumnB");

结果如下图
2

我们进一步设定合并条件,假如我们想 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;
    }
}

效果如下

3

下面我们将对上面的代码进行分析

首先是 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;,如果没有这句代码,该事件的代码将不起作用。

先给自己占个沙发

楼主好帅,爱你哦!

王胖胖真棒

真棒!用到了!

赞一下,刚做的模块正好用到了~

如果是好几列都按照一个列进行合并,需要写好几条 if (e.Column.FieldName == "ColumnX"),有什么办法整合起来

wangchenye 回复

如果是好几列都按照一个列进行合并,需要写好几条 if (e.Column.FieldName == "ColumnX"),有什么办法整合起来

骚年,这个艰巨而伟大的任务就交给你们新生代了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册