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. MongoDB索引操作和执行计划Explain()详解

    一.索引操作 说明,下面的内容举例时,以"dailyTrip"collection为例. 字段内容如下: { "_id" : ObjectId("63 ...

  2. vlak

    2023-7-14 题目 luogu题目传送门 题目描述 Nina 和 Emilija 正在玩一个特殊的游戏.这个游戏是在一张最开始为空白的纸上进行的.在每一个人的行动回合内,这个人会在这张纸上当前的 ...

  3. Java并发编程 优化多任务查询接口

    代码展示 @RestController @RequestMapping("/api") public class TestController { @Resource priva ...

  4. OptiX8入门(一)optixHello

    本人初学者,如有错误和更好的表述,请指出 环境:CLion+VS2022+CUDA Toolkit 12.0.1+OptiX8 下载好后打开SDK就可以看到OptiX官方提供的许多例子,CMake配置 ...

  5. 常见python工具的基本构造-入门

    一.常见库 exifread 读取图片中的信息,如GPS信息 https://blog.csdn.net/qq1198768105/article/details/128159598 tkinter ...

  6. MD5&MD5盐值加密到BCryptPasswordEncoder

    MD5&MD5盐值加密 Message Digest algorithm5,信息摘要算法: 压缩性:任意长度的数据,算出的MD5值长度都是固定的 容易计算:从原数据计算出MD5值很容易 抗修改 ...

  7. 记一次 .NET 某餐饮小程序 内存暴涨分析

    一:背景 1. 讲故事 前些天有位朋友找到我,说他的程序内存异常高,用 vs诊断工具 加载时间又太久,让我帮忙看一下到底咋回事,截图如下: 确实,如果dump文件超过 10G 之后,市面上那些可视化工 ...

  8. Modbus转profinet网关连接位移计在1200程序控制案例

    Modbus转profinet网关连接位移计在1200程序控制案例 本案例讲述了兴达易控Modbus转profinet网关(XD-MDPN100)连接现场用台达LD-E镭射位移计检测控制在1200PL ...

  9. 浅谈TCP协议的发生过程

    1. TCP协议 1.1 TCP协议的性质 面向连接的.可靠的.基于字节流 至于为什么面向连接,又为什么可靠,基于字节流的,等后面便可知道. 1.2 TCP协议栈收发数据的四个阶段 创建套接字 连接服 ...

  10. Strimzi Kafka Bridge(桥接)实战之一:简介和部署

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于<Strimzi Kafka Bridge( ...