datagridview自绘

来源:互联网 发布:照片恢复软件下载 编辑:程序博客网 时间:2024/06/06 00:30
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("隐藏信息列")                });            for (int i = 0; i < 5; i++)            {                DataRow row = dt.NewRow();                row[0] = "名称" + (i + 1);                row[1] = i % 2 == 0 ? "超级管理员" : "管理员";                row[2] = DateTime.Now.ToString("yyyy/MM/dd");                row[3] = DateTime.Now.AddDays(i).ToString("yyyy/MM/dd");                row[4] = "客户已经同意与(某某" + (i + 1) + " " + (i + 1) + "小时前)";                dt.Rows.Add(row);            }            dataGridView.ColumnCount = 5;            for (int i = 0; i < 5; i++)            {                dataGridView.Columns[i].Name = dt.Columns[i].ColumnName;                dataGridView.Columns[i].DataPropertyName = dt.Columns[i].ColumnName;                dataGridView.Columns[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;                if (i != 0)                    dataGridView.Columns[i].Width = 120;                else                    dataGridView.Columns[i].Width = 150;            }            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 - 1]);        }    }    public class DataGridViewRenderer    {        //行高        private const int ROW_HEIGHT = 70;        //目标DataGridView        private DataGridView dataGridView;        //需要自定义绘制的列        private DataGridViewColumn hiddenColumn;        //记录上一次选择的行,用于行索引改变时重绘该行而不是重绘整个控件画面        private int preRowIndex = 0;        //小图标        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 = new Padding(0, 1, 0, ROW_HEIGHT - 30);            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)        {            if (preRowIndex != -1)            {                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 = new Rectangle(0, e.RowBounds.Top,               dataGridView.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) -               dataGridView.HorizontalScrollingOffset + 1, 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, new Rectangle(textBounds.X + 5, textBounds.Y, icon1.Width, icon1.Height));                    e.Graphics.DrawImage(icon2, new Rectangle(textBounds.X + icon1.Width + 10, textBounds.Y, icon2.Width, icon2.Height));                    textBounds.X += icon1.Width * 2 + 15;                    textBounds.Y += 2;                    //画文字                    e.Graphics.DrawString(                        text, e.InheritedRowStyle.Font, brush, textBounds);                    e.Graphics.SetClip(oldClip);                }            }            finally            {                brush.Dispose();            }        }    }}

 

0 0
原创粉丝点击