C#重写DataGirdView

原创 2013年12月05日 09:37:37

首先我们先来看下效果




页面随窗体大小 自动调整大小




重写的DataGirdView 源码

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing.Drawing2D;
using System.Drawing;
using System.Windows.Forms;

namespace 流水
{
    /// <summary>
    /// 自定义DataGridView控件
    /// </summary>
    public class testDataGirdView:System.Windows.Forms.DataGridView
    {

        #region 重绘Column、Row

        int _RowHeadWidth = 41;
        /// <summary>
        /// 重绘Column、Row
        /// </summary>
        /// <param name="e"></param>
        protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)
        {
                //如果是Column
                if(e.RowIndex == -1) {
                    drawColumnAndRow(e);
                    e.Handled = true;
                    //如果是Rowheader
                } else if(e.ColumnIndex < 0 && e.RowIndex>=0) {
                    drawColumnAndRow(e);
                    _RowHeadWidth = e.CellBounds.Width;
                    e.Handled = true;
               }
        }

        /// <summary>
        /// Column和RowHeader绘制
        /// </summary>
        /// <param name="e"></param>
        void drawColumnAndRow(DataGridViewCellPaintingEventArgs e)
        {
            // 绘制背景色
            using (LinearGradientBrush backbrush =
                new LinearGradientBrush(e.CellBounds,
                    ProfessionalColors.OverflowButtonGradientBegin,
                    ProfessionalColors.OverflowButtonGradientMiddle 
                    , LinearGradientMode.Vertical)){
           
                Rectangle border = e.CellBounds;
                border.Width -= 1;
                //填充绘制效果
                e.Graphics.FillRectangle(backbrush, border);
                //绘制Column、Row的Text信息
                e.PaintContent(e.CellBounds);
                //绘制边框
                ControlPaint.DrawBorder3D(e.Graphics, e.CellBounds, Border3DStyle.Flat);

            }
        }

        #endregion


        #region 重绘选中状态

        #region Row重绘前处理

        /// <summary>
        /// Row重绘前处理
        /// </summary>
        /// <param name="e"></param>
        protected override void OnRowPrePaint(DataGridViewRowPrePaintEventArgs e)
        {
            base.OnRowPrePaint(e);

            //是否是选中状态
            if ((e.State & DataGridViewElementStates.Selected) ==
                        DataGridViewElementStates.Selected)
            {
                // 计算选中区域Size
                int width = this.Columns.GetColumnsWidth(DataGridViewElementStates.Visible)+_RowHeadWidth;
 
                Rectangle rowBounds = new Rectangle(
                  0 , e.RowBounds.Top, width,
                    e.RowBounds.Height);

                // 绘制选中背景色
                using (LinearGradientBrush backbrush =
                    new LinearGradientBrush(rowBounds,
                        Color.Salmon,
                        Color.Green, 10.0f))
                {
                    e.Graphics.FillRectangle(backbrush, rowBounds);
                    e.PaintCellsContent(rowBounds);
                    e.Handled = true;
                }

            }
        }

        #endregion

        #region Row重绘后处理

        /// <summary>
        /// Row重绘后处理
        /// </summary>
        /// <param name="e"></param>
        protected override void OnRowPostPaint(DataGridViewRowPostPaintEventArgs e)
        {
            base.OnRowPostPaint(e);
            int width = this.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) + _RowHeadWidth;
            Rectangle rowBounds = new Rectangle(
                   0, e.RowBounds.Top, width, e.RowBounds.Height);

            if (this.CurrentCellAddress.Y == e.RowIndex){
                //设置选中边框
                e.DrawFocus(rowBounds, true);
            }
        }

        #endregion

        #region Row刷新

        protected override void OnColumnWidthChanged(DataGridViewColumnEventArgs e)
        {
            base.OnColumnWidthChanged(e);
            if (this.CurrentRow != null)
                this.InvalidateRow(this.CurrentRow.Index);
        }

        protected override void OnScroll(ScrollEventArgs e)
        {
            base.OnScroll(e);
            if (this.CurrentRow != null)
                this.InvalidateRow(this.CurrentRow.Index);
        }

        #endregion

        #endregion


    }
}

页面随窗体大小 自动调整大小源码



首先把DataGirdView 控件 Anchor属性 设置为Top, Bottom, Left, Right


在启动事件写如下代码


        public void DataSize()
        {
            //获取dataGridView1的宽度
            int DataWidh = this.dataGridView1.Width;
            //获取dataGridView1的所以列
            int DataLengt = this.dataGridView1.Columns.Count;
            //45为第一个空格
            DataWidh = (DataWidh - 45) / DataLengt;
            dataGridView1.Columns[0].Width = DataWidh;
            dataGridView1.Columns[1].Width = DataWidh;
            dataGridView1.Columns[3].Width = DataWidh;
            dataGridView1.Columns[2].Width = DataWidh;

        }

这样基本上就实现了以上基本效果


希望大家多多支持
本  人 菜 鸟  级
刚   刚  毕   业
希望 通 过 博 客
提升下自己的能力

希望大家给点建议

相关文章推荐

编写DataGridView自定义列编辑器(自定义单元格编辑类)

转自生命体验博客 这几年都在web项目上工作和学习,windows的项目也只是windows服务,界面上的学习少了。这几天看了看DataGridView,跟.net1.1的差别还是很大。实现自定...
  • anyqu
  • anyqu
  • 2012年12月09日 10:09
  • 5267

在c#中实现DataGridView中自定义控件列

昨天晚上临睡前写了长长的一大堆,后来睡下去的时候,包括今天早上眼睛睁开来,发觉昨晚写的东西里思路还是有点混乱的。于是,今天再来不补充篇。 要实现的内容先表述下:新闻标题列表页上,呈现如下 新闻日期...

自定义DataGridView控件

using System; using System.Collections.Generic; using System.Text; using System.Drawing.Drawing2D; u...
  • hi_dzj
  • hi_dzj
  • 2012年02月14日 09:03
  • 3504

重写DataGridView

//#===========================================================================////#  //#  类名称       ...

C#winform datagridview如何自定义列头

 示例代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;us...

C#对DataGridView操作

C#针对datagridview 操作收集的一些资料,内容比较乱,以后再整理 C#对DataGridView进行添加、修改、删除数据操作 数据库用的是本地服务器(MySql): 设定全局变量:    ...

C# Datagirdview 用法集

[csharp] view plaincopy  SqlConnection conn = new SqlConnection('Server=(local);DataBase=test;User=...

DataGirdView的使用

SqlConnection conn = new SqlConnection('Server=(local);DataBase=test;User=sa;Pwd=sa'); SqlDataAdapt...

datagirdview

  • 2008年11月22日 08:42
  • 14KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#重写DataGirdView
举报原因:
原因补充:

(最多只允许输入30个字)