最近突然想在DataGridView标头放置一个CheckBox,我就想着重写下DataGridViewColumnHeaderCell
抱着试试的心态结果真的是可以的
下面是源码:(如果有看不懂的可以加 源码分享群 81582487 来问我)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Windows.Forms.VisualStyles;

namespace WindowsDemo
{

public  class MyDataGridViewColumnHeaderCell : DataGridViewColumnHeaderCell
    {

public delegate void CheckBoxClick(DataGridViewCellMouseEventArgs e);
        public delegate void ButtonClick(DataGridViewCellMouseEventArgs e);
        public event CheckBoxClick checkboxClick = null;
        public event ButtonClick buttonClick = null;

public MyDataGridViewColumnHeaderCell()
            : base()
        {
           
        }
        private Rectangle ChecboxLocation
        {
            get;
            set;
        }

private Rectangle ButtonLocation { get; set; }

public CheckBoxState CheckBoxTestState { get; set; }
         /// <summary>
        /// 单元格边框颜色
        /// </summary>
        private Color CellBorderColor { get { return Color.FromArgb(172, 168, 153); } }

protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle

cellBounds, int rowIndex, DataGridViewElementStates dataGridViewElementState, object value,

object formattedValue, string errorText, DataGridViewCellStyle cellStyle,

DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            var check = (Boolean)value;
            CheckBoxTestState = check ? CheckBoxState.CheckedNormal :

CheckBoxState.UncheckedNormal;
            if (paintParts == DataGridViewPaintParts.Background || paintParts ==

DataGridViewPaintParts.All)
            {
                graphics.FillRectangle(new SolidBrush(cellStyle.BackColor), cellBounds);
            }
            if (paintParts == DataGridViewPaintParts.Border || paintParts ==

DataGridViewPaintParts.All)
            {
                graphics.DrawRectangle(new Pen(CellBorderColor), cellBounds);
            }
            if (paintParts == DataGridViewPaintParts.SelectionBackground || Selected)
            {
                graphics.FillRectangle(new SolidBrush(cellStyle.SelectionBackColor),

cellBounds);
            }
            Point checboxPoint = new Point(cellBounds.X + 4, cellBounds.Y + cellBounds.Height

/ 4);
            Rectangle checboxRegtangle = new Rectangle(new Point(cellBounds.X + 4,

cellBounds.Y + cellBounds.Height / 4), new Size(40, 40));
            Rectangle buttonRectangle = new Rectangle(new Point(cellBounds.X + 50,

cellBounds.Y + cellBounds.Height / 4), new Size(40, 20));
            ChecboxLocation = checboxRegtangle;
            ButtonLocation = buttonRectangle;
            CheckBoxRenderer.DrawCheckBox(graphics, checboxPoint,checboxRegtangle,"tasi",new

Font("宋体",12),false,CheckBoxTestState);
            ButtonRenderer.DrawButton(graphics, buttonRectangle, true,

PushButtonState.Default);
            // base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value,

formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
        }

//DataGridview标头单元格绘制两个按钮,并指定两个按钮的事件
        protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
        {
            //这里位置要计算好,计算出CheckBox位置
            if (e.Location.X > ChecboxLocation.Location.X && e.Location.X <

ChecboxLocation.Location.X + ChecboxLocation.Width)
            {
                if (checkboxClick != null)
                {
                    checkboxClick(e);
                }
            }
             //计算出button的位置
            else if(e.Location.X

>ButtonLocation.Location.X&&e.Location.X<ButtonLocation.Location.X + ButtonLocation.Width)
            {
                buttonClick(e);
            }
            base.OnMouseClick(e);
        }
    }
}

使用也很简单:(使用时先把结构加载完了在对这列进行如下操作)
    MyDataGridViewColumnHeaderCell mycell = new MyDataGridViewColumnHeaderCell();
            mycell.checkboxClick+=new MyDataGridViewColumnHeaderCell.CheckBoxClick

(mycell_checkboxClick);
            mycell.buttonClick += new MyDataGridViewColumnHeaderCell.ButtonClick

(mycell_buttonClick);
            mycell.Value = true;
            this.view.Columns[0].HeaderCell = mycell;
            view.CellPainting += new DataGridViewCellPaintingEventHandler

(dataGridView1_CellPainting);

这个里面我写了两个控件,有点注意的是点击事件时我对按钮的位置没有控制好,我暂时没有认真写这个,

要是用的话自己要想下如何控制点击事件的位置,第二个是按钮的大小我没有控制,这个也需要自己来控制

重绘DataGridView标头的更多相关文章

  1. C# 自定义重绘DataGridView

    using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using Syste ...

  2. 重绘DataGridView的DataGridViewCheckBoxCell控件

    最近项目中要用到在DataGridView单元格里面放置一个带有文本的 DataGridViewCheckBoxCell控件但原有 的是不支持的然后我就想着重写个 DataGridViewCheckB ...

  3. 『转载』C# winform 中dataGridView的重绘(进度条,虚线,单元格合并等)

    原文转载自:http://hi.baidu.com/suming/item/81e45b1ab9b4585f2a3e2243 最近比较浅的研究了一下dataGridView的重绘,发现里面还是有很多东 ...

  4. C# DataGridView 更改类型 重绘

    DataGridView   更改类型 需要用到重绘 DataGridViewTextBoxColumn aa01 = new DataGridViewTextBoxColumn(); aa00.Da ...

  5. 关于DOM的操作以及性能优化问题-重绘重排

     写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...

  6. 关于repaint(重绘)和reflow( 回流)

    repaint就是重绘,reflow就是回流.repaint主要是针对某一个DOM元素进行的重绘,reflow则是回流,针对整个页面的重排 严重性: 在性能优先的前提下,性能消耗 reflow大于re ...

  7. MFC 滑动条的重绘

    MFC自带的滑动条的样子是这样的. 比较难看,所以需要重绘下,重绘后的样子是这样的. 代码如下: CustomSliderCtr.h #pragma once // CCustomSliderCtr ...

  8. WinForm中重绘TabControl选项卡标题

    最近开发WinForm频繁使用了TabControl控件,这个控件的选项卡没有BackgroundImage这个属性,那么如何为其各个选项卡添加背景图片呢?(这里说的是每个TabPage的头部,也就是 ...

  9. 回流(reflow)与重绘(repaint)

    最近项目排期不紧,于是看了一下之前看了好久也没看明白的chrome调试工具的timeline.但是很遗憾,虽然大概懂了每一项是做什么的,但是用起来并不能得心应手.所以今天的重点不是timeline,而 ...

随机推荐

  1. 洛谷——P1082 同余方程

    P1082 同余方程 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输 ...

  2. [转][MEF插件式开发] 一个简单的例子

    偶然在博客园中了解到这种技术,顺便学习了几天. 以下是搜索到一些比较好的博文供参考: MEF核心笔记 <MEF程序设计指南>博文汇总 先上效果图 一.新建解决方案 开始新建一个解决方案Me ...

  3. Ubuntu-14.04. sh .py腳本双击無法執行问题的解决方法

    Ubuntu-14.04中默认文件用gedit文本打开,而不是BT5里面的默认双击打开四个选择,例如以下图(这是配置完毕后的结果,就不换BT5系统了): 直接文本打开,尽管非常安全.实际生产中肯定是不 ...

  4. [Vue-rx] Share RxJS Streams to Avoid Multiple Requests in Vue.js

    Splitting a stream into multiple streams causes new subscriptions. You can think of new subscription ...

  5. QT如何修改字符编码格式

    编辑-Select Encoding,然后在弹出窗口中修改字符编码.                      

  6. 改动grub默认启动顺序

    grub如今有两个版本号,一个grub,一个grub2,两个版本号的操作不太一样. 装centos的朋友非常有可能是grub.我电脑装的是ubuntu14.04,为grub2.我演示grub2的过程. ...

  7. 解决MyEclipse中导入项目@Override错误

    做项目的时候,同事那边电脑上编译通过的java代码,或者是网上下载的例子代码,导入project后却是编译不通过,总是@override报错,把@override去掉就好了,有时候@Override出 ...

  8. linux (debian) 配置静态ip

    在局域网内使用动态ip分配,机器动态的获取 ip地址.可是我使用ssh登录的时候.总是断线. 后来发现,原来机器总是在两个ip地址192.168.2.203 和192.168.2.228之间切换.用s ...

  9. LeetCode 83. Remove Duplicates from Sorted List (从有序链表中去除重复项)

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  10. Ubuntu 12.04 LTS 无法进入桌面环境

    今天开机后,在登陆的时候,进入了登陆界面(选择用户,输入密码的那个界面),输入正确的密码后屏幕跳转了一下,但是很快又回到了登陆界面.然后我就尝试以guest [访客]的身份登陆,发现进入了桌面系统. ...