DataGridView合并单元格,重绘后选中内容被覆盖的解决办法
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合并单元格,重绘后选中内容被覆盖的解决办法的更多相关文章
- DataGridView合并单元格
昨天一个同事问我DataGridView单元格合并的问题,一开始按照我的设想是算出两个单元格的Rectangle,然后直接使用e.Graphics.FillRectangle(backColorBru ...
- DataGridView合并单元格(一列或一行)
#region"合并单元格的测试(一列或一行)" // int?是搜索一种类型(可空类型),普通的int不能为null,而用int?,其值可以为null //private int ...
- DataGridView合并单元格(多行多列合并)
一.点击在拖入的显示控件(TreeList)右上方的箭头,在Treelist任务中选择数据源,添加项目数据源,依次选择数据库.数据集,新建连接,浏览选择数据库(*.mdb),依次点击 下一步,选择“表 ...
- [办公应用]如何将excel合并单元格分拆后每个单元格上仍保留数据?
合并单元格虽然美观,但是无法进行排序.筛选等操作. 只有合并单元格拆分后才可以按常规进行统计.但是普通拆分后,excel仅保留合并单元格数据到区域左上角的单元格. 解决方案:选定多个合并单元格,应用本 ...
- sencha grid templatecolumn模板列,actioncolumn和renderer实现单元格重绘
templatecolumn列: { xtype: 'templatecolumn', ...
- Windows Forms DataGridView中合并单元格
Windows Forms DataGridView 没有提供合并单元格的功能,要实现合并单元格的功能就要在CellPainting事件中使用Graphics.DrawLine和 Graphics.D ...
- JS动态生成表格后 合并单元格
JS动态生成表格后 合并单元格 最近做项目碰到表格中的单元格合并的问题,需求是这样的,首先发ajax请求 请求回来后的数据 动态生成表格数据,但是生成后如果编号或者(根据其他的内容)有相同时,要合并单 ...
- datagridview 纵向 横向 合并单元格
datagridview 单元格合并:纵向以及横向合并参考了csdn上不知哪位的代码,具体哪位找不到连接了. 纵向合并: /// <summary> /// 纵向合并,即合并数据项的值 / ...
- java poi 合并单元格后边框问题
在项目中用poi合并单元格,但发现边框会有不显示的问题. 在网上搜集了答案,来记录一下. 解决方法: 将每个没用到的单元格都设空值. 例如: HSSFCell cell = row.createCel ...
- Qt高仿Excel表格组件-支持冻结列、冻结行、内容自适应和合并单元格
目录 一.概述 二.效果展示 三.实现思路 1.冻结行.冻结列 2.行高自适应 3.蚂蚁线 四.测试代码 1.添加表格数据 2.设置冻结行.列 3.行高.列宽 4.单元格背景色 5.单元格文字 6.其 ...
随机推荐
- Docker部署cas
一.首先安装cas镜像 1.拉取cas docker镜像 docker pull apereo/cas 2.启动容器: docker run --name cas -p 8443:8443 -p 8 ...
- [错误] SQL logic error near "date": syntax error
问题的来源 今天把一个项目的数据库从MySQL改到Sqlite 调试时发生了这个错误. 百度又看不懂英文(很多是国外发的), 就折腾了一下 原因 C# Sqlite 不能使用参数前缀"?&q ...
- 最接地气的.NET微服务框架
前言: "人必有所执,方能有所成",从2018年底我就开始规划要写一个.NET微服务框架,5年了,今天终于正式发布了. 正文: Wing 致力于打造一个功能强大.最接地气的.NET ...
- Azure Data Factory(八)数据集验证之服务主体(Service Principal)
一,引言 如下图所示,今天我们接着上一篇内容,继续讲解 Azure Data Factory 中的数据集连接服务的认证方式:Service Principal 关于 Service Principal ...
- 如何随心所欲调试HotSpot VM源代码?(改造为CMakeLists项目)
常有小伙伴问我是怎么调试HotSpot VM源代码的,我之前通过视频和文章介绍过一种大家都用的调试方法,如下: 文章地址:第1.2篇-调试HotSpot VM源代码(配视频) 视频地址:https:/ ...
- 手把手教你写一个JSON在线解析的前端网站1
前言 作为一名Android开发,经常要跟后端同事联调接口,那么总避免不了要格式化接口返回值,将其转换为清晰直观高亮的UI样式以及折叠部分内容,方便我们查看定位关键的信息. 一直以来都是打开Googl ...
- 高性能日志脱敏组件:已支持 log4j2 和 logback 插件
项目介绍 日志脱敏是常见的安全需求.普通的基于工具类方法的方式,对代码的入侵性太强,编写起来又特别麻烦. sensitive提供基于注解的方式,并且内置了常见的脱敏方式,便于开发. 同时支持 logb ...
- 计算机的数值转化与网络的IP地址分类与地址划分
数值转换 数字系统由来 远古时代是没有数字系统非位置化数字系统: 罗马数字 (I-1.II-2.III-3.IV-4.V-5.VI-6.VII-7.VIII-8.IX-9.X-10) 位置话数字化系统 ...
- Go 如何实现多态
在 Go 语言中,虽然没有经典的面向对象编程中的继承和多态的概念,但你可以通过接口(interface)来实现多态性.Go 语言鼓励组合和接口多态,这使得代码更加灵活和模块化.下面将详细介绍 Go 语 ...
- ASP.NET CORE MVC的一些说明
1.ASP.NET CORE MVC 是微软公司的Web应用开发框架,结合了MVC架构的高效.简洁等优秀思想并融合了.NET的灵活性. 2.ASP.NET诞生于2002年,当时微软想保持桌面应用程序的 ...