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

//#===========================================================================////#  //#  类名称       ...
  • star19851019
  • star19851019
  • 2009年07月07日 14:14
  • 1374

重写DataGridViewColumn

前几天在尝试使用2005新出的DataGridView 控件,结果在接收当前编辑状态下的文本信息的时候出现了麻烦。比方我现在处在第一行第一列,然后我输入一个1,那这个1是什么时候才会邦定到空间的val...
  • LeoMaya
  • LeoMaya
  • 2006年12月27日 02:27
  • 2110

漂亮的datagridviewC#皮肤

  • 2013年11月09日 15:20
  • 2.07MB
  • 下载

C#新建DataColumn类时Type类型参数的生成方式

DataColumn类的几个需要Type类型参数的构造函数如下: // // 摘要: // 使用指定列名称和数据类型初始化 System.Data...
  • testcs_dn
  • testcs_dn
  • 2014年07月26日 11:29
  • 18478

定制DataGridView快捷菜单ContextMenuStrip的关联事件

前言 经常使用表格控件DataGridView的行关联快捷菜单(也称为上下文弹出菜单)ContextMenuStrip,基本步骤如下: 在窗体上设计ContextMenuStrip快捷菜单控件;设置...
  • kingmax54212008
  • kingmax54212008
  • 2015年03月12日 17:13
  • 2306

ProcessCmdKey方法 DataGridView按Enter回车键转到下一列的格

使用DataGridView的时候经常需要修改其默认的操作方式,如按Enter回车键转到下一列的格,或直接把Enter当成是Tab键。这样的需求,对于DataGridView来说是很简单的。你需要做的...
  • llxlett
  • llxlett
  • 2013年01月17日 13:00
  • 1402

WinForm程序用使用List对象绑定DataGridView数据源

1、 在用List对象绑定DataGridView数据源属性的时候,数据源的内容不会动态更新,如果List对象集合中的数据发生变化,那么数据控件的数据源是不会得到更新的。一般也不建议用List去填充数...
  • shuaishifu
  • shuaishifu
  • 2014年02月28日 10:11
  • 4348

C# Datagirdview 用法集

[csharp] view plaincopy  SqlConnection conn = new SqlConnection('Server=(local);DataBase=test;User=...
  • u010141129
  • u010141129
  • 2014年12月18日 20:03
  • 396

C#Winform中DataGirdView最简单的增删改查

  • 2017年07月06日 14:53
  • 53KB
  • 下载

消除datagirdview导出excel合并行出现合并提示对话框

要将事业部导出excel的时候合并,就得动态的去判断事业部下的内容,遇到相同的则合并,不相同 的不合并。不能动态写死(文中加粗处)。 private void ExportExcels(string...
  • kingtracy8
  • kingtracy8
  • 2017年12月28日 23:10
  • 21
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#重写DataGirdView
举报原因:
原因补充:

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