C# WinForm下DataGridView绘制背景图

C# WinForm下DataGridView绘制背景图

C/S架构现在好像是越来越少了,但是有些产品又不得不用,自带的各种样式又丑,做出来的效果产品设计看了想打人,各种折腾,这次要求dataGridView背景颜色要渐变,默认属性搞不定,就想到用背景图片,然而DataGridView没让我失望,没有背景图属性,好开心的跟产品说,控件不支持,被吊打,回来老老实实想方法,看过程:

发现DataGridView是有BackgroundImage属性的,且看其定义:

[Browsable(false)]

[EditorBrowsable(EditorBrowsableState.Never)]

public override Image BackgroundImage { get; set; }

不可见的,一个刻意对开发工具隐藏了的属性,你能指望它会有功能?不死心,代码中一试,果然没有任何效果。

于是想起来终极大法:OnPaint方法,一般情况下在控件中,重写这个方法,肯定能绘制出来你想要的任何形状,但是在DataGridVeiw控件中,居然出现了意想不到的问题:

1.当在base.OnPaint(e)之前调用e.Graphics.DrawImage()方法时,数据行的部分是透明的,但是背景部分仍是原来的颜色;

2.当在base.OnPaint(e)之后调用e.Graphics.DrawImage()方法时,DataGridView全部被图片遮盖,想想这种情况也是必须的。

难道GridView真没有办法绘制背景么?我不太相信,于是再探MSDN(很多人平时根本不看MSDN,遇到问题就求救,这样相当不好),果然发现一个方法:

protected virtual void PaintBackground(Graphics graphics, Rectangle clipBounds, Rectangle gridBounds);

看名字就很给力啊,赶紧重写:

protected override void PaintBackground(Graphics graphics, Rectangle clipBounds, Rectangle gridBounds)

{

    graphics.DrawImageUnscaledAndClipped(this.BackgroundImage, gridBounds);

}

呵呵,你不让我使用BackgroundImage,我还非得使用了,BackgroundImage只是被“隐藏”,但是使用还是没有问题的,正好拿来保存背景图片。

果然,运行程序后出结果了,但是又有另一个问题了,数据行的背景是透明的,这样的话数据就可能被背景影响,导致看不清楚,最好是能给数据行加一个半透明的背景,(此处略过一小时的研究过程...)最终发现有一个方法可以绘制单元格的背景,单元格绘制了,数据行不就自然O了吗?

protected internal virtual void OnCellPainting(DataGridViewCellPaintingEventArgs e);

最终代码确定了:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Drawing.Drawing2D;

namespace WindowsFormsApplication3

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

            this.dataGridView1.BackgroundImage = Image.FromFile("c:\\2216400.jpg");

            this.dataGridView1.DefaultCellStyle.BackColor = Color.FromArgb(128, Color.White);

            this.dataGridView1.DefaultCellStyle.SelectionBackColor = Color.FromArgb(128, Color.Blue);

        }

    }

    public class MyDataGrid : DataGridView

    {

        protected override void PaintBackground(Graphics graphics, Rectangle clipBounds, Rectangle gridBounds)

        {

            graphics.DrawImageUnscaledAndClipped(this.BackgroundImage, gridBounds);

        }

        protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e)

        {

            if (e.RowIndex == -1 || e.ColumnIndex == -1)

            {

                return;

            }

            Rectangle newRect = new Rectangle(e.CellBounds.X + 1,

                e.CellBounds.Y + 1, e.CellBounds.Width - 4,

                e.CellBounds.Height - 4);

            using (

                Brush gridBrush = new SolidBrush(this.GridColor),

                backColorBrush = new SolidBrush(e.CellStyle.BackColor),

                selectedColorBrush = new SolidBrush(e.CellStyle.SelectionBackColor))

            {

                using (Pen gridLinePen = new Pen(gridBrush))

                {

                    if (this.Rows[e.RowIndex].Selected)

                    {

                        e.Graphics.FillRectangle(selectedColorBrush, e.CellBounds);

                    }

                    else

                    {

                        e.Graphics.FillRectangle(backColorBrush, e.CellBounds);

                    }

                    if (e.Value != null)

                    {

                        e.Graphics.DrawString((String)e.Value, e.CellStyle.Font,

                            Brushes.Black, e.CellBounds.X + 2,

                            e.CellBounds.Y + 2, StringFormat.GenericDefault);

                    }

                }

                e.Handled = true;

            }

        }

    }

}

女神效果图:

其他什么标题行背景色,左边栏隐藏等等都是自带属性,这里就不说了,各位自己探索

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 C# WinForm 中,可以使用 DataGridView 控件进行数据展示和编辑。如果数据量较大,可以对 DataGridView 进行分页,以提高程序的性能和用户体验。具体实现方法可以参考 DataGridView 控件的 Paging 属性和 PageIndex 属性。 ### 回答2: 我不知道"C"的问题具体指的是哪个领域或具体的问题,所以我会就"C"作出一些可能的解释和回答。 如果"C"指的是编程语言的"C",那么它是一种过去和现在都非常流行的编程语言,因为它具有简单、高效、灵活等特点,广泛应用于系统开发、网络编程、游戏开发、科学计算等领域。注意到"C"语言只提供基本的语言结构和函数库,需要充分发挥程序员的能力,编写简洁高效的程序。 如果"C"指的是数学中的"C",那么它可以有不同的含义,比如表示常数"C"、复数中的实部"C"、曲线的曲率"C"等。具体应用在不同的数学问题中,可能会有不同的解释和方法。 如果"C"指的是其他的概念或问题,这里就不能具体回答,需要更多的上下文和信息才能进行详细的探讨和回答。 ### 回答3: C是一门高级编程语言,由贝尔实验室的Dennis M. Ritchie在20世纪70年代初发明。C是一种系统编程语言,被广泛应用于操作系统、编译器、网络协议、驱动程序等方面的开发。C有着简洁、高效、灵活的特点,使得它在计算机科学领域的应用非常广泛,被誉为“高级语言中的低级语言”。 C语言是一种结构化编程语言,支持变量、运算符、循环、条件语句、数组、指针等基本特性,同时也支持自定义函数、结构体等高级特性。C中的语句执行速度非常快,因为C代码编译成机器码后能够直接执行,没有中间层的解释器或虚拟机。 与其他高级语言相比,C的语法比较严格,需要程序员手动管理内存、指针等,这也是学习C语言时需要掌握的重要知识点。另外,由于C语言的运行效率高,对于底层开发及系统级编程有很大作用,因此C语言在各种嵌入式、操作系统、游戏等领域得到了广泛的应用。 总的来说,C是一门广泛应用于计算机科学领域的高级编程语言,其简洁、高效、灵活的特点使得它广受欢迎。如果你想进一步了解计算机科学领域的知识,学习C语言是一个很好的起点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值