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 ...
随机推荐
- 构建日均千万PV Web站点1
如何构建日均千万PV Web站点 (一) 其实大多数互联网网站起初的网站架构都是(Linux+Apache+MySQL+PHP). 不过随着时代的发展,科技的进步.互联网进入寻常百姓家的生活.所谓的用 ...
- Angularjs学习---ubuntu12.04中karma安装配置
Angularjs学习---ubuntu12.04中karma安装配置中常见的问题总结 karma启动时出现了很多问题: 1.安装karma前提条件 安装karma首先要安装nodejs,npm然 ...
- 你是否听过 TypeScript?
Type入门(JavaScript的超集)-译 你是否听过 TypeScript? TypeScript 是 JavaScript 的超集,TypeScript结合了类型检查和静态分析,显式接口. ...
- [置顶] Ants(Northeastern Europe 2007)
Ants Time Limit: 5 ...
- 在Linux使用GCC编译C语言共享库
在Linux使用GCC编译C语言共享库 对任何程序员来说库都是必不可少的.所谓的库是指已经编译好的供你使用的代码.它们常常提供一些通用功能,例如链表和二叉树可以用来保存任何数据,或者是一个特定的功能例 ...
- 实践中总结——理解haslayout和BFC
1.HASLAYOUT 首先,haslayout翻译成中文就是:有布局. 所谓布局,指的是一个元素可以对本身和里边的元素进行尺寸计算和定位.这里只是谈IE6/7,据说微软之所以不是对所有元素默认有布局 ...
- c#winform关闭窗口时触发的事件
用户关闭软件时,软件一般会给“是否确认关闭”的提示. 通常,我们把它写在FormClosing 事件中,如果确定关闭,就关闭:否则把FormClosingEventArgs 的 Cancel 属性设置 ...
- MVC一些需要注意的问题
不使用MVC,不知道MVC的好处,但是也会有一些坑,需要注意一下: 比如控件中添加HTML5自定义属性,以为是这样: @Html.TextBox("date",Model.Date ...
- springmvc国际化 基于浏览器语言的国际化配置
当前标签: springmvc springmvc国际化 基于浏览器语言的国际化配置 苏若年 2013-10-09 13:03 阅读:305 评论:0 SpringMVC中应用Ajax异步通讯 ...
- 使用数据流的方式 将数据导出到指定形式到Word中 (不使用插件,很简单的一种)
protected void Page_Load(object sender, EventArgs e) { string fileName = "路政许可事项办理流转情况汇总统计" ...