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自绘的更多相关文章

  1. DataGridView重绘painting简单实例

    private void dataGridViewX1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { & ...

  2. C#.NET,技巧篇(DataGridView线程操作)

    这个系列的文章,主要是平时做C#.NET(Framework 3.5)开发的时候,积累的经验和技巧.我们平时总有这样的体会,遇到一个特别难解决的问题,网上寻它千百度也没能搜索到有用的信息.这时你肯定会 ...

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

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

  4. C# DataGridView 更改类型 重绘

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

  5. C# 自定义重绘DataGridView

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

  6. 重绘DataGridView标头

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

  7. 重绘DataGridView的DataGridViewCheckBoxCell控件

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

  8. DataGridView之编码列重绘

    实现方式如下: private void dgvRelation_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { ...

  9. c# DataGridView 的一些属性设置,序号,合并头

      this.dataGridView1.DataSource = this.dISASTERBindingSource;             this.dataGridView1.Locatio ...

随机推荐

  1. 基于Jquery 简单实用的弹出提示框

    基于Jquery 简单实用的弹出提示框 引言: 原生的 alert 样子看起来很粗暴,网上也有一大堆相关的插件,但是基本上都是大而全,仅仅几句话可以实现的东西,可能要引入好几十k的文件,所以话了点时间 ...

  2. 解决C# WinForm 中 VSHOST.EXE 程序不关闭的问题

    右击“解决方案”--属性-调试栏-启用调试器部分-“启用Visual studio宿主进程”不勾选

  3. IOS UI 第三篇:基本UI

    工厂模式:   .h文件:   #import <Foundation/Foundation.h>typedef enum{    QFRed,    QFYellow,    QFBlu ...

  4. Asp.Net Web Api 与 Andriod 接口对接开发

    Asp.Net Web Api 与 Andriod 接口对接开发经验,给小伙伴分享一下!   最近一直急着在负责弄Asp.Net Web Api 与 Andriod 接口开发的对接工作! 刚听说要用A ...

  5. 应用facebook .net sdk

    1.本博客主要介绍如何应用facebook .net SDK,实现发帖.点赞.上传照片视频等功能,更多关于facebook API,请参考:https://developers.facebook.co ...

  6. [转]The Best Plugins for Sublime Text

    Source: http://ipestov.com/the-best-plugins-for-sublime-text/ Good day, everyone! I tried to collect ...

  7. (转)cin、cin.get()、cin.getline()、getline()、gets()等函数的用法

    学C++的时候,这几个输入函数弄的有点迷糊:这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行)转载请保留作者信息:1.cin1 ...

  8. C#的匿名委托 和 Java的匿名局部内部类

    .NET:C#的匿名委托 和 Java的匿名局部内部类 目录 背景实验备注 背景返回目录 这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一 ...

  9. java的几种对象解释

    一.PO:persistent object 持久对象,可以看成是与数据库中的表相映射的Java对象.最简单的PO就是对象数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何数据 ...

  10. data格式加载图片

    html img 使用data格式加载图片   背景 这久闲来无事给一位客户测试一款体检软件,是winform结构的,其中有一个功能是需要把生成的体检报告导出为html格式.测试导出后直接在谷歌浏览器 ...