DataGridView合并单元格只能进行重绘,网上基本上使用的是下面的方法:

 1 /// <summary>
2 /// 说明:纵向合并单元格
3 /// 参数:dgv DataGridView,e 绘制的单元格
4 /// </summary>
5 public void MergeCell(DataGridView dgv, DataGridViewCellPaintingEventArgs e)
6 {
7 int x = e.RowIndex, y = e.ColumnIndex;
8 using (Brush gridBrush = new SolidBrush(dgv.GridColor), backColorBrush = new SolidBrush(e.CellStyle.BackColor))
9 {
10 using (Pen gridLinePen = new Pen(gridBrush))
11 {
12 // 擦除原单元格
13 e.Graphics.FillRectangle(backColorBrush, e.CellBounds);
14 ////绘制单元格相互间隔的区分线条, datagridview自己会处理左侧和上边缘的线条
15 bool b = false;
16 if (x == dgv.RowCount - 1)
17 b = true;
18 else
19 if (e.Value.ToString() != dgv.Rows[x + 1].Cells[y].Value.ToString())
20 b = true;
21 if (b)
22 {
23 //下边缘的线
24 e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);
25 int fontheight = (int)e.Graphics.MeasureString(e.Value.ToString(), e.CellStyle.Font).Height;
26 int fontwidth = (int)e.Graphics.MeasureString(e.Value.ToString(), e.CellStyle.Font).Width;
27 int cellheight = e.CellBounds.Height;
28 int cellwidth = e.CellBounds.Width;
29 int countRows = 1; //计算合并单元格的总行数,以便内容可以居中显示
30 for (int i = x; i > 0; i--)
31 {
32 if (dgv.Rows[i - 1].Cells[y].Value.ToString() == e.Value.ToString())
33 countRows++;
34 else
35 break;
36 }
37 //绘制值
38 e.Graphics.DrawString(e.Value.ToString(), e.CellStyle.Font, Brushes.Black, e.CellBounds.X + (cellwidth - fontwidth) / 2, e.CellBounds.Y - cellheight * (countRows - 1) + (cellheight * countRows - fontheight) / 2, StringFormat.GenericDefault);
39 }
40 //右侧的线
41 e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1);
42 //设置处理事件完成(关键点),只有设置为ture,才能显示出想要的结果
43 e.Handled = true;
44 }
45 }
46 }

通过重绘可以达到合并单元格的目的,可是内容不居中很难看,居中的话又会出现点问题,如果选中重绘时擦除的单元格,内容会被覆盖,想了各种办法修改以上代码都无法解决。
最终另辟蹊径,不重绘单元格,而是新建Label覆盖到单元格上,达到合并单元格的假象,对DataGridView不作任何处理,这样就不会出现内容显示的问题了(唯一存在的问题就是合并的单元格无法被选中了),代码如下:

 1 /// <summary>
2 /// 说明:纵向合并单元格
3 /// 参数:dgv DataGridView,e 绘制的单元格
4 /// </summary>
5 public void MergeCell(DataGridView dgv, DataGridViewCellPaintingEventArgs e)
6 {
7 int x = e.RowIndex, y = e.ColumnIndex;
8 bool b = false;
9 if (x == dgv.RowCount - 1)
10 b = true;
11 else
12 if (e.Value.ToString() != dgv.Rows[x + 1].Cells[y].Value.ToString())
13 b = true;
14 if (b)
15 {
16 int countRows = 1;//合并单元格的总行数
17 for (int i = x; i > 0; i--)
18 {
19 if (dgv.Rows[i - 1].Cells[y].Value.ToString() == e.Value.ToString())
20 countRows++;
21 else
22 break;
23 }
24 Rectangle cell = e.CellBounds;
25 Label newLable = new Label();
26 newLable.BackColor = Color.White;
27 newLable.Height = cell.Height * countRows - 1;
28 newLable.Width = cell.Width - 1;
29 newLable.TextAlign = ContentAlignment.MiddleCenter;
30 newLable.Left = cell.X;
31 newLable.Top = cell.Y - (countRows - 1) * cell.Height;
32 newLable.Text = e.Value.ToString();
33 dgv.Controls.Add(newLable);
34 }
35 }

DataGridView合并单元格,重绘后选中内容被覆盖的解决办法的更多相关文章

  1. DataGridView合并单元格

    昨天一个同事问我DataGridView单元格合并的问题,一开始按照我的设想是算出两个单元格的Rectangle,然后直接使用e.Graphics.FillRectangle(backColorBru ...

  2. DataGridView合并单元格(一列或一行)

    #region"合并单元格的测试(一列或一行)" // int?是搜索一种类型(可空类型),普通的int不能为null,而用int?,其值可以为null //private int ...

  3. DataGridView合并单元格(多行多列合并)

    一.点击在拖入的显示控件(TreeList)右上方的箭头,在Treelist任务中选择数据源,添加项目数据源,依次选择数据库.数据集,新建连接,浏览选择数据库(*.mdb),依次点击 下一步,选择“表 ...

  4. [办公应用]如何将excel合并单元格分拆后每个单元格上仍保留数据?

    合并单元格虽然美观,但是无法进行排序.筛选等操作. 只有合并单元格拆分后才可以按常规进行统计.但是普通拆分后,excel仅保留合并单元格数据到区域左上角的单元格. 解决方案:选定多个合并单元格,应用本 ...

  5. sencha grid templatecolumn模板列,actioncolumn和renderer实现单元格重绘

    templatecolumn列: {                                     xtype: 'templatecolumn',                     ...

  6. Windows Forms DataGridView中合并单元格

    Windows Forms DataGridView 没有提供合并单元格的功能,要实现合并单元格的功能就要在CellPainting事件中使用Graphics.DrawLine和 Graphics.D ...

  7. JS动态生成表格后 合并单元格

    JS动态生成表格后 合并单元格 最近做项目碰到表格中的单元格合并的问题,需求是这样的,首先发ajax请求 请求回来后的数据 动态生成表格数据,但是生成后如果编号或者(根据其他的内容)有相同时,要合并单 ...

  8. datagridview 纵向 横向 合并单元格

    datagridview 单元格合并:纵向以及横向合并参考了csdn上不知哪位的代码,具体哪位找不到连接了. 纵向合并: /// <summary> /// 纵向合并,即合并数据项的值 / ...

  9. java poi 合并单元格后边框问题

    在项目中用poi合并单元格,但发现边框会有不显示的问题. 在网上搜集了答案,来记录一下. 解决方法: 将每个没用到的单元格都设空值. 例如: HSSFCell cell = row.createCel ...

  10. Qt高仿Excel表格组件-支持冻结列、冻结行、内容自适应和合并单元格

    目录 一.概述 二.效果展示 三.实现思路 1.冻结行.冻结列 2.行高自适应 3.蚂蚁线 四.测试代码 1.添加表格数据 2.设置冻结行.列 3.行高.列宽 4.单元格背景色 5.单元格文字 6.其 ...

随机推荐

  1. 浅析 GlusterFS 与 JuiceFS 的架构异同

    在进行分布式文件存储解决方案的选型时,GlusterFS 无疑是一个不可忽视的考虑对象.作为一款开源的软件定义分布式存储解决方案,GlusterFS 能够在单个集群中支持高达 PiB 级别的数据存储. ...

  2. Controller 层代码技巧

    Controller 层代码技巧 前言 本篇主要要介绍的就是controller层的处理,一个完整的后端请求由4部分组成: 接口地址(也就是URL地址) 请求方式(一般就是get.post,当然还有p ...

  3. 【Qt6】工具提示以及调色板设置

    工具提示即 Tool Tip,当用户把鼠标移动到某个UI对象上并悬停片刻,就会出现一个"短小精悍"的窗口,显示一些说明性文本.一般就是功能描述,让用户知道这个XX是干啥用的. 在 ...

  4. 转载|QA|Pycharm一行代码太长如何换行?|Pycharm|工具相关

  5. Windows 某些软件显示"口口"解决办法

    和乱码不同,文字变成"口口",一般是语言环境出错了. 解决办法 开始->控制面板->区域 (时钟.语言和区域)->区域:更改设置->管理->非 Uni ...

  6. C#希尔排序算法

    前言 希尔排序简单的来说就是一种改进的插入排序算法,它通过将待排序的元素分成若干个子序列,然后对每个子序列进行插入排序,最终逐步缩小子序列的间隔,直到整个序列变得有序.希尔排序的主要思想是通过插入排序 ...

  7. 关闭k8s的pod时减小对服务的影响

    在应用程序的整个生命周期中,正在运行的 pod 会由于多种原因而终止.在某些情况下,Kubernetes 会因用户输入(例如更新或删除 Deployment 时)而终止 pod.在其他情况下,Kube ...

  8. Java爬虫实战系列2——动手写爬虫初体验

    在上面的章节中,我们介绍了几个目前比较活跃的Java爬虫框架.在今天的章节中,我们会参考开源爬虫框架,开发我们自己的Java爬虫软件. 首先,我们下载本章节要使用到的源代码,本章节主要提供了基于HTT ...

  9. 介绍五个很实用的IDEA使用技巧

    日常开发中,相信广大 Java 开发者都使用过 IntelliJ IDEA 作为开发工具,IntelliJ IDEA 是一款优秀的 Java 集成开发环境,它提供了许多强大的功能和快捷键,可以帮助开发 ...

  10. 解决Dependency 'fastdfs-client-java’not found

    如何能把 fastdfs的jar包安装到本地的仓库中(因为中央仓库没有FASTDFS的jar包地址) 1.首先去github上下载下来fastdfs的压缩包 下载链接 然后直接解压出来 2.使用cmd ...