重绘DataGridView标头
最近突然想在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标头的更多相关文章
- C# 自定义重绘DataGridView
using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using Syste ...
- 重绘DataGridView的DataGridViewCheckBoxCell控件
最近项目中要用到在DataGridView单元格里面放置一个带有文本的 DataGridViewCheckBoxCell控件但原有 的是不支持的然后我就想着重写个 DataGridViewCheckB ...
- 『转载』C# winform 中dataGridView的重绘(进度条,虚线,单元格合并等)
原文转载自:http://hi.baidu.com/suming/item/81e45b1ab9b4585f2a3e2243 最近比较浅的研究了一下dataGridView的重绘,发现里面还是有很多东 ...
- C# DataGridView 更改类型 重绘
DataGridView 更改类型 需要用到重绘 DataGridViewTextBoxColumn aa01 = new DataGridViewTextBoxColumn(); aa00.Da ...
- 关于DOM的操作以及性能优化问题-重绘重排
写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...
- 关于repaint(重绘)和reflow( 回流)
repaint就是重绘,reflow就是回流.repaint主要是针对某一个DOM元素进行的重绘,reflow则是回流,针对整个页面的重排 严重性: 在性能优先的前提下,性能消耗 reflow大于re ...
- MFC 滑动条的重绘
MFC自带的滑动条的样子是这样的. 比较难看,所以需要重绘下,重绘后的样子是这样的. 代码如下: CustomSliderCtr.h #pragma once // CCustomSliderCtr ...
- WinForm中重绘TabControl选项卡标题
最近开发WinForm频繁使用了TabControl控件,这个控件的选项卡没有BackgroundImage这个属性,那么如何为其各个选项卡添加背景图片呢?(这里说的是每个TabPage的头部,也就是 ...
- 回流(reflow)与重绘(repaint)
最近项目排期不紧,于是看了一下之前看了好久也没看明白的chrome调试工具的timeline.但是很遗憾,虽然大概懂了每一项是做什么的,但是用起来并不能得心应手.所以今天的重点不是timeline,而 ...
随机推荐
- JAVA包装类的缓存范围
JAVA包装类的缓存范围 前两天面试遇到两个关于JAVA源码的问题,记录下来提醒自己. 1.写出下面的输出结果 System.out.println(Integer.valueOf("100 ...
- NetCore发布WebApi项目到IIS服务器中
1.确保已在机器上安装Net Core Runtime,,下载地址: https://dotnet.microsoft.com/download 2.点击WebApi项目右键->发布,选择IIS ...
- 阿里云nginx创建多站点
最近开始用阿里云的vps,用了它的一键安装包安装了php环境,nginx的.下面记录创建多站点的心得. 首先php安装好后会自带安装一个phpwind的站点. 文件目录存放在 /alidata/www ...
- window.setTimeout() 和window.setInterval() 的差别
setTimeout 和setInterval的功能都是经过某一个时间段后发生某件指定的事件或者方法. 如window.setTimeout("sleep()",5000);指的是 ...
- POJ--3164--Command Network【朱刘算法】最小树形图
链接:http://poj.org/problem?id=3164 题意:告诉n个点坐标,m条边表示两个点之间有路.从1点開始建立一个有向图最小生成树. 朱刘算法模板题 =============== ...
- Codeforces 446C —— DZY Loves Fibonacci Numbers(线段树)
题目:DZY Loves Fibonacci Numbers 题意比較简单,不解释了. 尽管官方的题解也是用线段树,但还利用了二次剩余. 可是我没有想到二次剩余,然后写了个感觉非常复杂度的线段树,还是 ...
- WCF问题集锦:ReadResponse failed: The server did not return a complete response for this request.
今日.对代码进行单元測试时.发现方法GetAllSupplyTypes报例如以下错误: [Fiddler] ReadResponse() failed: The server did not retu ...
- 主表a主表b 从表c中有ab两个表中各一个字段a1,b1 从表d中有ab两个表中各一个字段a2,b2
a1和a2在a表中具有唯一性 b1和b2在b表中具有唯一性 现在需要连接c表和d表 需要分两步来做 1.先让c表join表a和表b select c.*,a.a2,b.b2 from c inner ...
- git实验室
git clone一个项目 jiqing@jiqing-System-Product-Name:/home/wwwroot/default$ sudo git clone http://106.14. ...
- 【Bzoj2260】【Bzoj4349】商店购物 & 最小树形图
目录 List Bzoj 2260 商店购物 Description Input Output Sample Input Sample Output Bzoj 4349 最小树形图 Descripti ...