Datagridview 实现二维表头

C# DataGridView 二维表头 立即下载

http://www.cnblogs.com/neuhawk/archive/2006/09/28/517507.html

      最近把我们的b/s系统,增加智能客户端的功能。确实智能客户端是非常好用的东西。可惜winform的控件功能不怎么强大,相比vb差很多啊。比如 DataGridView不支持二维表头,不支持表尾合计,相比之下 web的好办多了(还是喜欢Web的排版、导航,但喜欢Win的操作性,希望WPF早日流行)。

       但是 MIS系统没有二维表头确实是客户不能接受的,尝试了com控件flexgrid或者开源的SourceGrid3,但都不怎么好用,于是想改造一下 DataGridView。我的做法是在CellPainting做手脚。花了一天时间尝试,只是做出原型,还没有完善,希望有需要的朋友少走弯路。

  1,继承DataGridView,添加表头信息类。
  2,添加CellPainting,代码如下:

   private   void  DataGridViewEx_CellPainting( object  sender, DataGridViewCellPaintingEventArgs e)
        
{
            
if  (e.RowIndex  ==   - 1 )
            
{
             
//    int w = dataGridView1.HorizontalScrollingOffset + dataGridView1.TopLeftHeaderCell.Size.Width + dataGridView1.Columns[0].Width + 10;


                Rectangle newRect 
=   new  Rectangle(e.CellBounds.X  +   1 ,
               e.CellBounds.Y 
+   1 , e.CellBounds.Width  -   4 ,
               e.CellBounds.Height 
-   4 );

                
using  (
                    Brush gridBrush 
=   new  SolidBrush( this .GridColor),
                    backColorBrush 
=   new  SolidBrush(e.CellStyle.BackColor))
                
{
                    
using  (Pen gridLinePen  =   new  Pen(gridBrush))
                    
{
                        
//  Erase the cell.
                        e.Graphics.FillRectangle(backColorBrush, e.CellBounds);

                        
//  Draw the grid lines (only the right and bottom lines;
                        
//  DataGridView takes care of the others).
                        e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left,
                            e.CellBounds.Bottom 
-   1 , e.CellBounds.Right  -   1 ,
                            e.CellBounds.Bottom 
-   1 );
                        
if  (e.ColumnIndex  >   - 1   &&  topRow != null && topRow.Cells[e.ColumnIndex].ColSpan > 1 )
                        
{
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right 
-   1 ,
                                e.CellBounds.Top 
+  e.ClipBounds.Height  /   2 , e.CellBounds.Right  -   1 ,
                                e.CellBounds.Bottom);
                        }

                        
else
                        
{
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right 
-   1 ,
                                                          e.CellBounds.Top, e.CellBounds.Right 
-   1 ,
                                                          e.CellBounds.Bottom);
                        }


                        
//  Draw the inset highlight box.
                        
//    e.Graphics.DrawRectangle(Pens.Blue, newRect);

                        
int  scale  =  e.CellBounds.Height / 3 ;
                        
if  (e.ColumnIndex  >   - 1   &&  topRow.Cells[e.ColumnIndex].Text  !=   null )
                        
{
                            scale
=  e.CellBounds.Height  /   2 ;
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom 
-  e.CellBounds.Height  /   2 , e.CellBounds.Right, e.CellBounds.Bottom  -  e.CellBounds.Height  /   2 );
                        }

                        
//  Draw the text content of the cell, ignoring alignment.

                      

                        
if  (e.Value  !=   null )
                        
{
                            e.Graphics.DrawString(e.Value.ToString(), e.CellStyle.Font,
                                Brushes.Crimson, e.CellBounds.X 
+   2 ,
                                e.CellBounds.Y 
+  scale +   2 , StringFormat.GenericDefault);



                        }





                        
if  (e.ColumnIndex  >   - 1   &&   topRow.Cells[e.ColumnIndex].RelateIndex  >   - 1   &&  topRow.Cells[e.ColumnIndex].Text != null )
                    
                        
{
                            Rectangle recCell 
=   new  Rectangle(e.CellBounds.X  -   1   -  topRow.Cells[e.ColumnIndex].SpanRowWith,
           e.CellBounds.Y 
+   1 , topRow.Cells[e.ColumnIndex].SpanRowWith,
           e.CellBounds.Height 
/   2 );


                            StringFormat sf 
=   new  StringFormat();

                            sf.Alignment 
=  StringAlignment.Center;


                            e.Graphics.DrawString(topRow.Cells[e.ColumnIndex].Text, e.CellStyle.Font, Brushes.Crimson, recCell, sf);

                        }

               
                        e.Handled 
=   true ;
                    }

                }

            }


        }


3,调用方法

  dataGridViewEx1.TopRow.Cells[ 2 ].Text  =   " 入库 " ;
            dataGridViewEx1.TopRow.Cells[
2 ].ColSpan  =   2 ;


            dataGridViewEx1.TopRow.Cells[
4 ].Text  =   " 出库 " ;
            dataGridViewEx1.TopRow.Cells[
4 ].ColSpan  =   2 ;

4,效果图


至于表尾合计,也做出了原型。二维表头+表尾合计,基本上满足需求了。

DataGridView多层表头-二维表头 DataGridView二维表头表头合并单元格 百分之百可用(含源码) 立即下载

相关推荐

C# datagridview二维表头

datagridview单元格合并,二维表头绘画

寻找数组的中心索引

给你一个整数数组 nums ,请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。 如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 优化后: class Solution { public int pivotIndex(int[] nums) { int su

weixin_47486152的博客 895

DataGridView单元格合并和二维表头_datagridview_

DataGridView单元格合并和二维表头制作代码

C# 数组下标的问题

http://www.cnblogs.com/neuhawk/archive/2006/09/28/517507.htmlDatagridview 实现二维表头       最近把我们的b/s系统,增加智能客户端的功能。确实智能客户端是非常好用的东西。可惜winform的控件功能不怎么强大,相比vb差很多啊。比如 DataGridView不支持二维表头,不支持表尾合计,相比之下 web的好

c 4764

基于深度学习卷积神经网络的医学图像乳腺癌分类

一、项目背景与意义乳腺癌是女性最常见的恶性肿瘤之一,其早期发现和治疗对于提高患者的生存率和生活质量至关重要。然而,乳腺癌的诊断通常依赖于医生的经验和主观判断,这不仅耗时而且可能存在误差。近年来,深度学习技术特别是卷积神经网络(CNN)在图像处理领域取得了显著进展,为乳腺癌的自动分类提供了新的解决方案。本项目旨在利用深度学习卷积神经网络构建一套高效、准确的医学图像乳腺癌分类系统,辅助医生进行乳腺癌的早期诊断和治疗。二、技术实现。

2301_79810943的博客 976

无人驾驶感知融合——横摆角速度的多源估计算法解析

本文深入解析了无人驾驶感知融合中的横摆角速度多源估计算法,详细介绍了轮速差法、侧向加速度法、曲率法和惯性传感器直读法四种计算方法及其优缺点。通过卡尔曼滤波实战案例,展示了多源融合算法在提升精度和稳定性方面的显著优势,并探讨了工程实践中的时间对齐、坐标系统一等关键问题。

weixin_31458015的博客 462

c#中字符串显示上标和下标解决办法

由于工作的需求,需要在word中插入带入带有上标和下标的字符串,比如这样的一个字符串:SO₄²⁻(mg/L)。在网上搜了好久,终是摸索出点思路。   解决办法:使用转义字符加Unicode的HexEntity就可以实现了。比如定义一个SO₄²⁻(mg/L)这样的字符串如下:"SO\x2084\x00B2\x207B(mg/L)"。其中x2084为₄(注意:此处为4的下标) 的Unicod...

liu749929309的博客 6622

存储关键技术·RAID技术·RAID2.0·华为RAID2.0+·华为服务器·云计算

一.RAID基本概念 常见的RAID级别组合RAID级别 二.RAID的数据组织形式 三.RAID的数据保护功能 方法一:镜像方法二:奇偶校验算法(XOR) 四.RAID热备和重构 1.热备(Hot Spare)的定义2.热备的分类3.热备的工作原理 五.RAID 2.0技术 1.RAID 2.02.RAID 2.0+3.华为RAID 2.0+ 六.RAID 2.0+块虚拟化技术 1.什么会出现RAID 2.0+技术?2.什么是RAID 2.0?3.RAID 2.0+的原理是什么?

qq_47480932的博客 3320

C#数组的使用

数组 数组的定义 : 可以存储相同类型多个数据的集合,数组的长度一旦确定就不能改变 获取数组的长度:数组名.Lenght 数组的元素 : 数组中的每个值我们称为元素,元素之间用逗号间隔 数组的下标 : 数组中的元素都有下标,从0开始,第一个元素是0,后面元素的下标是前一个元素的下标加1 下标是获取数组元素的必须值 注意:...

梦回唐朝 8570

基于禾赛32线雷达和Xsens MTi-G-710 组合导航模块,松灵Scout mini 底盘实现 Cartographer 3D 建图过程

地下车库 Cartongrapher 3D建图

yhy_yhy13053117的博客 3936

【血汗泪心路历程】怎么彻底删掉Sangfor文件?怎么彻底删除easyconnect?删除sangfor后网络坏了、某些app无法正常启动怎么解决?

教程来源于网络的五湖四海+gpt解答。用到了好几个教程和方法,遂这篇总结一下。会标明出处!先上一下战绩:终于把sangfor扔进回收站里了!!!哈哈哈那一刻真的好爽。

weixin_71246590的博客 6万+

C语言-数组

对于“数组”的学习分享

2201_76032321的博客 968

【零基础学习CAPL】——弹窗信息提示

不用手动制作Panel窗口,直接使用CAPL脚本实现弹窗提示。//没有wait超时,等待测试人员确认//有wait超时,对话框在超时后自动终止//有wait超时,可以显示一个资源,即对话框可以显示额外的信息。/*参数说明text:显示在弹窗中的内容,长度限制在4096字符timeout:弹窗自动结束的时间,单位:ms。若为0,则无超时控制heading:对话框文本上方的标题。字符串最大长度限制在256个字符。resource:URL或文件路径。字符串的最大长度是有限的(512个字符)。

LOVE135149的博客 264

C# DataGridView实现二维表头

VS2022 C# windowForm自定义控件DataGridView实现二维表头

m0_67599428的博客 4083

【云原生】Docker可视化工具Portainer使用详解

Docker可视化工具Portainer使用详解

congge 1万+

【华为OD机试真题】459、小扇和小船的数字游戏、数字游戏 | 机试真题+思路参考+代码解析(CD卷)(C++、Java、Py)

### 🎃题目描述 >小扇和小船今天又玩起来了数字游戏,小船给小扇一个正整数 n(1  现在求 m 的最小值

KJ.JK 1718

[转]Datagridview 实现二维表头

[转]Datagridview 实现二维表头 http://www.cnblogs.com/neuhawk/archive/2006/09/28/517507.html   求教:DataTable多层表头及合并 http://topic.youkuaiyun.com/u/20120327/08/e61911c4-644e-470e-b82a-ee82feddcb9a.html?88835

keenweiwei的专栏 1842

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C实现DataGridView二维表头与合计栏

C#实现DataGridView二维表头与合计栏 去发现同类优质开源项目:https://gitcode.com/ 此资源文件提供了C#语言编写的代码示例,用于在DataGridView控件中实现二维表头以及合计栏功能。代码简洁易懂,便于学习和应用。 功能概述 实现DataGridView控件的二维表头。 添加合计栏,显示各列的合计值。 注意事项 本代码示例适用于具备基础C#编程知识的开发者...

gitblog_06760的博客 264

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Datagridview 实现二维表头和行合并【转载】

using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Drawing.Design; using System.Windows.Forms; /// <summary> /// DataGr...

weixin_34247032的博客 252

DataGridView合并表头实现 、二维表头的实现

ASP.net下實現合并單元格相對簡單,很大程度上是因為基於HTML;Winform下的DataGridView實現比較繁瑣,目前看似只有重繪這條路;如果嫌累可以使用Developer Express .NET的全套解決方案;[轉載]二维表头的实现,來源不明 int top = 0; int left = 0; int height = 0;...

banglvfei0870的博客 818
上一篇: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏
下一篇: C# access日期查询加#
firehou
博客等级 码龄17年 114粉丝 46原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值