datagridview自绘
https://msdn.microsoft.com/zh-cn/library/85kxk29c(v=vs.85).aspx

以上效果实现代码如下,细节部分就由你完善了,这里只是写个小例子:
using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
namespace PaintGridView
{
public partial class Form1 : Form
{
DataGridView dataGridView = new DataGridView();
public Form1()
{
InitializeComponent();
SetupControls();
}
public void SetupControls()
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[]
{
new DataColumn("名称"),
new DataColumn("参与者"),
new DataColumn("创建日期"),
new DataColumn("更新日期"),
new DataColumn("隐藏信息列")
});
; i < ; i++)
{
DataRow row = dt.NewRow();
row[] = );
row[] = i % == ? "超级管理员" : "管理员";
row[] = DateTime.Now.ToString("yyyy/MM/dd");
row[] = DateTime.Now.AddDays(i).ToString("yyyy/MM/dd");
row[] = ) + ) + "小时前)";
dt.Rows.Add(row);
}
dataGridView.ColumnCount = ;
; i < ; i++)
{
dataGridView.Columns[i].Name = dt.Columns[i].ColumnName;
dataGridView.Columns[i].DataPropertyName = dt.Columns[i].ColumnName;
dataGridView.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
)
dataGridView.Columns[i].Width = ;
else
dataGridView.Columns[i].Width = ;
}
dataGridView.AutoGenerateColumns = false;
dataGridView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
dataGridView.DataSource = dt;
dataGridView.Dock = DockStyle.Fill;
this.Controls.Add(dataGridView);
//只需要把需要绘制的DataGridView传入DataGridViewRenderer即可,
//这里的隐藏列即为需要重新绘制的内容
DataGridViewRenderer render = new DataGridViewRenderer(dataGridView,
dataGridView.Columns[dataGridView.ColumnCount - ]);
}
}
public class DataGridViewRenderer
{
//行高
;
//目标DataGridView
private DataGridView dataGridView;
//需要自定义绘制的列
private DataGridViewColumn hiddenColumn;
//记录上一次选择的行,用于行索引改变时重绘该行而不是重绘整个控件画面
;
//小图标
private Bitmap icon1;
private Bitmap icon2;
public DataGridViewRenderer(DataGridView dataGridView, DataGridViewColumn hiddenColumn = null)
{
this.dataGridView = dataGridView;
this.hiddenColumn = hiddenColumn;
SetupControl();
}
/// <summary>
/// 设置控件属性
/// </summary>
private void SetupControl()
{
if (dataGridView == null) return;
if (hiddenColumn != null)
{
hiddenColumn.Visible = false;
}
//用户不能调整列标题高度
dataGridView.ColumnHeadersHeightSizeMode =
DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
//隐藏行标题
dataGridView.RowHeadersVisible = false;
//设置行高
dataGridView.RowTemplate.Height = ROW_HEIGHT;
//设置内边距大小
Padding newPadding = , , , ROW_HEIGHT - );
dataGridView.RowTemplate.DefaultCellStyle.Padding = newPadding;
dataGridView.AllowUserToAddRows = false;
//设置无单元格边框
dataGridView.CellBorderStyle = DataGridViewCellBorderStyle.None;
//单元格选择模式为全选
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders);
//设置字体样式
dataGridView.DefaultCellStyle.SelectionForeColor = Color.Black;
dataGridView.DefaultCellStyle.ForeColor = Color.DimGray;
//设置选中行背景色,需要绘制自定义背景应该在RowPrePaint处理,并设置该属性为Color.Transparent;
dataGridView.RowTemplate.DefaultCellStyle.SelectionBackColor =Color.Orange;
//绑定一些事件实现自定义行绘制
dataGridView.ColumnWidthChanged += new
DataGridViewColumnEventHandler(dataGridView_ColumnWidthChanged);
dataGridView.RowHeightChanged += new
DataGridViewRowEventHandler(dataGridView_RowHeightChanged);
dataGridView.CurrentCellChanged += new
EventHandler(dataGridView_CurrentCellChanged);
dataGridView.RowPostPaint += new
DataGridViewRowPostPaintEventHandler(dataGridView_RowPostPaint);
//初始化小图标,这里在资源列表获取
icon1 = Properties.Resources._01;
icon2 = Properties.Resources._02;
}
/// <summary>
/// 列宽度改变时使控件整个画面无效并导致重绘
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)
{
dataGridView.Invalidate();
}
/// <summary>
/// 列高度改变时调整行内边距大小
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView_RowHeightChanged(object sender, DataGridViewRowEventArgs e)
{
int preHeight = e.Row.GetPreferredHeight(
e.Row.Index, DataGridViewAutoSizeRowMode.AllCellsExceptHeader, true) -
e.Row.DefaultCellStyle.Padding.Bottom;
Padding newPadding = e.Row.DefaultCellStyle.Padding;
newPadding.Bottom = e.Row.Height - preHeight;
e.Row.DefaultCellStyle.Padding = newPadding;
}
/// <summary>
/// 重绘前一个选择的行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView_CurrentCellChanged(object sender, EventArgs e)
{
)
{
dataGridView.InvalidateRow(preRowIndex);
}
preRowIndex = dataGridView.CurrentCellAddress.Y;
}
/// <summary>
/// 处理绘制行内容
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
Rectangle rowBounds = , e.RowBounds.Top,
dataGridView.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) -
dataGridView.HorizontalScrollingOffset + , e.RowBounds.Height);
SolidBrush brush = null;
try
{
if ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected)
brush = new SolidBrush(e.InheritedRowStyle.SelectionForeColor);
else
brush = new SolidBrush(e.InheritedRowStyle.ForeColor);
//获取隐藏列的值
object hiddenObj = dataGridView.Rows[e.RowIndex].Cells[hiddenColumn.Name].Value;
if (hiddenObj != null)
{
String text = hiddenObj.ToString();
//设定内容边界
Rectangle textBounds = rowBounds;
textBounds.X -= dataGridView.HorizontalScrollingOffset;
textBounds.Width += dataGridView.HorizontalScrollingOffset;
textBounds.Y += rowBounds.Height - e.InheritedRowStyle.Padding.Bottom;
textBounds.Height -= rowBounds.Height - e.InheritedRowStyle.Padding.Bottom;
textBounds.Height = (textBounds.Height / e.InheritedRowStyle.Font.Height) *
e.InheritedRowStyle.Font.Height;
RectangleF oldClip = e.Graphics.ClipBounds;
e.Graphics.SetClip(textBounds);
//画图标
e.Graphics.DrawImage(icon1, , textBounds.Y, icon1.Width, icon1.Height));
e.Graphics.DrawImage(icon2, , textBounds.Y, icon2.Width, icon2.Height));
textBounds.X += icon1.Width * + ;
textBounds.Y += ;
//画文字
e.Graphics.DrawString(
text, e.InheritedRowStyle.Font, brush, textBounds);
e.Graphics.SetClip(oldClip);
}
}
finally
{
brush.Dispose();
}
}
}
}
datagridview自绘的更多相关文章
- DataGridView重绘painting简单实例
private void dataGridViewX1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { & ...
- C#.NET,技巧篇(DataGridView线程操作)
这个系列的文章,主要是平时做C#.NET(Framework 3.5)开发的时候,积累的经验和技巧.我们平时总有这样的体会,遇到一个特别难解决的问题,网上寻它千百度也没能搜索到有用的信息.这时你肯定会 ...
- 『转载』C# winform 中dataGridView的重绘(进度条,虚线,单元格合并等)
原文转载自:http://hi.baidu.com/suming/item/81e45b1ab9b4585f2a3e2243 最近比较浅的研究了一下dataGridView的重绘,发现里面还是有很多东 ...
- C# DataGridView 更改类型 重绘
DataGridView 更改类型 需要用到重绘 DataGridViewTextBoxColumn aa01 = new DataGridViewTextBoxColumn(); aa00.Da ...
- C# 自定义重绘DataGridView
using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using Syste ...
- 重绘DataGridView标头
最近突然想在DataGridView标头放置一个CheckBox,我就想着重写下DataGridViewColumnHeaderCell抱着试试的心态结果真的是可以的下面是源码:(如果有看不懂的可以加 ...
- 重绘DataGridView的DataGridViewCheckBoxCell控件
最近项目中要用到在DataGridView单元格里面放置一个带有文本的 DataGridViewCheckBoxCell控件但原有 的是不支持的然后我就想着重写个 DataGridViewCheckB ...
- DataGridView之编码列重绘
实现方式如下: private void dgvRelation_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { ...
- c# DataGridView 的一些属性设置,序号,合并头
this.dataGridView1.DataSource = this.dISASTERBindingSource; this.dataGridView1.Locatio ...
随机推荐
- Web面试之JQuery
程序员Web面试之JQuery 又到了一年一度的毕业季了,青春散场,却等待下一场开幕. 在求职大军中,IT行业的程序员.码农是工科类大学生的热门选择之一, 尤其是近几年Web的如火如荼,更是吸引了 ...
- c# in deep 之对Linq表达式范围变量限制问题的一些解决办法
linq表达式的标准形式为from...where...select,其中from后面跟的就是范围变量.linq中范围变量需要是泛型的集合,假如我们想对ArrayList或Object[]进行处理,l ...
- 1047找环环&1503整数探究
1047就是判断一个数乘以他的位数1~n后是这个数转来转去的一个形式.主要就是大整数乘法 贴shi代码 #include<iostream> #include<string> ...
- inet_aton()
两次技术面试都被让c语言实现inet_aton()函数 看来这个函数真的很重要. 我先贴上我自己的实现代码 #include <stdio.h> #include <math.h&g ...
- IceMx.Mvc 我的js MVC 框架 开篇
开篇 这篇文章是后补的,前端时间想写一些对于js开发的一些理解,就直接写了,后来发现很唐突,所以今天在这里补一个开篇. 我的js Mvc 框架 基于实用设计,过分设计等于没设计.本着简单的原则,它只实 ...
- key-list类型内存数据引擎介绍及使用场景
“互联网数据目前基本使用两种方式来存储,关系数据库或者key value.但是这些互联网业务本身并不属于这两种数据类型,比如用户在社会化平台中的关系,它是一个list,如果要用关系数据库存储就需要转换 ...
- 开始使用THREE.JS
开始使用THREE.JS 译序 Three.js是一个伟大的开源WebGL库,WebGL允许JavaScript操作GPU,在浏览器端实现真正意义的3D.但是目前这项技术还处在发展阶段,资料极为匮乏, ...
- 为什么MD5不能解密
MD5加密原理是散列算法,也称之为hash算法. 具体的算法很多种,我也不是很懂,写得太专业了,我们只能理解一些简单的.简单才能让人记得住. 举例说明,10除以3余数是1,4除以3的余数也是1,反过来 ...
- VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机
VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机 VMwareView手动池可以管理物理计算机 说明: 环境基于实验二十三 1.准备一台Windows 7的物理计算机名 ...
- 使用JDK中的安全包对数据进行加解密
本文以使用DES对称加密算法为例使用jdk对数据进行加密解密. 首先需要了解Provider类,它是jdk引入的密码服务提供者概念,实现了Java安全性的一部分或者全部.Provider 可能实现的服 ...