日期:2014-05-16  浏览次数:20603 次

C# 数据库系统中使用GDI+绘制柱状图

在C#+SQL Server数据库做系统中,通常需要对数据库中的数据进行绘制图形报表方便经理查看,虽然有很多实用的水晶报表控件和图表控件实现该功能,但我还是想讲讲如何使用GDI绘制简单的柱状图.(推荐大家不要手画,尽量使用已有控件函数绘制)

一.前言

我们在使用C#+SQL Server做的简单应用系统是一个手机销售的系统,所以它有不同手机品牌和不同年份销售手机的利润和数量的柱状图,方便公司经理查看那个月和那种品牌手机销售更好,方便进货增加企业利润.其中它点击"输入年份",查看"2013"年的销售柱状图数据如下所示:(其实效果还行)

二.绘制坐标

下面就首先讲述如何使用GDI+绘制简单的柱状图,首先上面图中我定义为是静态柱状图,因为它X(横坐标)只有12个月份的数据,不会改变,而后面讲解的我定义的动态柱状图会根据手机品牌动态更新数据的,后面将介绍.
首先第一步需要绘制坐标,创建一个"C# Windows窗体应用程序",添加一个简单的button.然后双击button,进入button1_Click(object sender, EventArgs e)事件.添加如下代码.

//定义变量
Graphics graphic;                                      //GDI+绘图图面
SolidBrush Bfill = new SolidBrush(Color.Black);        //定义单色画刷用于填充图形
Pen Rpen = new Pen(Color.Red, 3);                      //创建红色画笔 
//该函数用于绘制坐标
private void CreateTable()
{
    graphic = this.CreateGraphics();                   
    Rectangle rect = new Rectangle(120, 20, 380, 300); //绘制黑色背景
    graphic.FillRectangle(Bfill, rect);                //填充这个矩形
    //Y坐标 (150,40)不变
    graphic.DrawLine(Rpen, new Point(150, 40), new Point(150, 300));   //Y坐标
    graphic.DrawLine(Rpen, new Point(150, 40), new Point(140, 50));    //Y坐标 左箭头
    graphic.DrawLine(Rpen, new Point(150, 40), new Point(160, 50));    //Y坐标 右箭头 
    //X坐标 (470,300)不变
    graphic.DrawLine(Rpen, new Point(150, 300), new Point(470, 300));  //X坐标 
    graphic.DrawLine(Rpen, new Point(460, 290), new Point(470, 300));  //X坐标 上箭头
    graphic.DrawLine(Rpen, new Point(460, 310), new Point(470, 300));  //X坐标 下箭头 
}

 在private void button1_Click(object sender, EventArgs e)事件中增加"CreateTable();"代码即可点按钮时击创建坐标,如图:

它具体的坐标如下图所示,其中Rectangle(120, 20, 380, 300)对应Rectangle(int x, int y, int width, int height)表示一个矩形对用起始位置和长宽;使用graphic.DrawRectangle是绘制一个空心的矩形,而graphic.FillRectangle(画刷,矩形)对矩形进行填充.使用graphic.DrawLine(Pen,Point1,Point2)表示画笔,起始坐标xy,终止坐标xy,是绘制直线,其中在绘制箭头需要注意它的相应坐标.其实在草稿纸上设计好在绘制,感觉还是很方便的.

注意:在C#中load事件中是不能画图的,因为Windows的GDI必须在拥有屏幕资源的时候才能有效,FormLoad时窗体还没有绘图资源,所以不能画出.在窗体创建完成后如果再调用FormLoad时间就可以绘制图形.所以我是在点击按钮时创建坐标.

三.静态的柱状图

 下面是绘制静态的柱状图,它的运行效果如下图所示,绘制了12个等高的柱状图:

它的源代码如下,通过调用DrawTable()绘制静态的图形.为什么我定义它为静态的后面将介绍:

//定义变量
Brus