winform重绘DataGridView行号,实现带块高亮显示

实际效果图

winform重绘DataGridView行号,实现带块高亮显示

我们新建一个组件BaseDataGridView,继承System.Windows.Forms.DataGridView

重写OnRowPostPaint方法.

一:如果显示行标题我们则绘制

if (RowHeadersVisible)

二:如果当前行处于选中状态,我们则绘制

   if ((e.State & DataGridViewElementStates.Selected) != 0)

先绘制整个行标题的背景颜色

e.Graphics.FillRectangle(new SolidBrush(Color.White), new Rectangle(e.RowBounds.Left, e.RowBounds.Top, RowHeadersWidth, e.RowBounds.Height));

然后绘制色块

e.Graphics.FillRectangle(new SolidBrush(Color.Red), new Rectangle(e.RowBounds.Left, e.RowBounds.Top, 4, e.RowBounds.Height));

如果没有被选中则只绘制背景颜色

e.Graphics.FillRectangle(new SolidBrush(Color.White), new Rectangle(e.RowBounds.Left, e.RowBounds.Top, RowHeadersWidth, e.RowBounds.Height));

三:绘制标题序号

   if (e.RowIndex < 0) return;

   string sortNo = (e.RowIndex + 1).ToString();    e.Graphics.DrawString(sortNo, RowHeadersDefaultCellStyle.Font, new SolidBrush(RowHeadersDefaultCellStyle.ForeColor), new Rectangle(e.RowBounds.Left + 6, e.RowBounds.Top, RowHeadersWidth, e.RowBounds.Height));

四:绘制单元格的线条

        e.Graphics.DrawLine(new Pen(Color.Red), e.RowBounds.Left, e.RowBounds.Bottom - 1, e.RowBounds.Right, e.RowBounds.Bottom - 1);

                e.Graphics.DrawLine(new Pen(Color.Red), e.RowBounds.Left + RowHeadersWidth - 1, e.RowBounds.Top, e.RowBounds.Left + RowHeadersWidth - 1, e.RowBounds.Bottom);

完整代码

        protected override void OnRowPostPaint(DataGridViewRowPostPaintEventArgs e)        {            base.OnRowPostPaint(e);            //如果显示行号            if (RowHeadersVisible)            {                if ((e.State & DataGridViewElementStates.Selected) != 0)                {                    //绘制空白区域                    e.Graphics.FillRectangle(new SolidBrush(Color.White), new Rectangle(e.RowBounds.Left, e.RowBounds.Top, RowHeadersWidth, e.RowBounds.Height));                    //绘制一个宽度为4的红色块                    e.Graphics.FillRectangle(new SolidBrush(Color.Red), new Rectangle(e.RowBounds.Left, e.RowBounds.Top, 4, e.RowBounds.Height));                }                else //如果没有被选中 背景色则为白色                {                    e.Graphics.FillRectangle(new SolidBrush(Color.White), new Rectangle(e.RowBounds.Left, e.RowBounds.Top, RowHeadersWidth, e.RowBounds.Height));                }                //绘制行号                if (e.RowIndex < 0) return;                string sortNo = (e.RowIndex + 1).ToString();                e.Graphics.DrawString(sortNo, RowHeadersDefaultCellStyle.Font, new SolidBrush(RowHeadersDefaultCellStyle.ForeColor), new Rectangle(e.RowBounds.Left + 6, e.RowBounds.Top, RowHeadersWidth, e.RowBounds.Height));                //绘制行号线条                e.Graphics.DrawLine(new Pen(Color.Red), e.RowBounds.Left, e.RowBounds.Bottom - 1, e.RowBounds.Right, e.RowBounds.Bottom - 1);                e.Graphics.DrawLine(new Pen(Color.Red), e.RowBounds.Left + RowHeadersWidth - 1, e.RowBounds.Top, e.RowBounds.Left + RowHeadersWidth - 1, e.RowBounds.Bottom);            }         //绘制完毕        }