当我们的软件需要各种饼状图和柱状图来表示数据时我们或许会想到用Offices中的图形控件或是第三方控件但现在的第三方控件大都需要注册有些免费的控件会有开发商的标记等而对于使用Offices的图形控件来说并不能在程序中得于很好控制其使用的简易程度也较低所以在这我给出在C#中使用GDI+实现饼状图和柱状图跟数据库联接显示数据的方法
using System;
using SystemIO;//用于文件存取
using SystemData;//用于数据访问
using SystemDrawing;//提供画GDI+图形的基本功能
using SystemDrawingText;//提供画GDI+图形的高级功能
using SystemDrawingDrawingD;//提供画高级二维矢量图形功能
using SystemDrawingImaging;//提供画GDI+图形的高级功能
namespace BaseLayer
{
public class PieChart
{
public PieChart()
{
}
//Render是图形大标题图开小标题图形宽度图形长度饼图的数据集和饼图的数据集要表示出来的数据
public Image Render(string title string subTitle int width int height DataSet chartDataint DataLine)
{
const int SIDE_LENGTH = ;
const int PIE_DIAMETER = ;
DataTable dt = chartDataTables[];
//通过输入参数取得饼图中的总基数
float sumData = ;
foreach(DataRow dr in dtRows)
{
sumData += ConvertToSingle(dr[DataLine]);
}
//产生一个image对象并由此产生一个Graphics对象
Bitmap bm = new Bitmap(widthheight);
Graphics g = GraphicsFromImage(bm);
//设置对象g的属性
gScaleTransform((ConvertToSingle(width))/SIDE_LENGTH(ConvertToSingle(height))/SIDE_LENGTH);
gSmoothingMode = SmoothingModeDefault;
gTextRenderingHint = TextRenderingHintAntiAlias;
//画布和边的设定
gClear(ColorWhite);
gDrawRectangle(PensBlackSIDE_LENGTHSIDE_LENGTH);
//画饼图标题
gDrawString(titlenew Font(Tahoma)BrushesBlacknew PointF());
//画饼图的图例
gDrawString(subTitlenew Font(Tahoma)BrushesBlacknew PointF());
//画饼图
float curAngle = ;
float totalAngle = ;
for(int i=;i<dtRowsCount;i++)
{
curAngle = ConvertToSingle(dtRows[i][DataLine]) / sumData * ;
gFillPie(new SolidBrush(ChartUtilGetChartItemColor(i))PIE_DIAMETERPIE_DIAMETERtotalAnglecurAngle);
gDrawPie(PensBlackPIE_DIAMETERPIE_DIAMETERtotalAnglecurAngle);
totalAngle += curAngle;
}
//画图例框及其文字
gDrawRectangle(PensBlack);
gDrawString(图表说明new Font(TahomaFontStyleBold)BrushesBlacknew PointF());
//画图例各项
PointF boxOrigin = new PointF();
PointF textOrigin = new PointF();
float percent = ;
for(int i=;i<dtRowsCount;i++)
{
gFillRectangle(new SolidBrush(ChartUtilGetChartItemColor(i))boxOriginXboxOriginY);
gDrawRectangle(PensBlackboxOriginXboxOriginY);
percent = ConvertToSingle(dtRows[i][DataLine]) / sumData * ;
gDrawString(dtRows[i][]ToString() + + dtRows[i][]ToString() + ( + percentToString() + %)new Font(Tahoma)BrushesBlacktextOrigin);
boxOriginY += ;
textOriginY += ;
}
//回收资源
gDispose();
return (Image) bm;
}
}
//画条形图
public class BarChart
{
public BarChart()
{
}
//Render是图形大标题图开小标题图形宽度图形长度饼图的数据集和饼图的数据集
public Image Render(string title string subTitle int width int height DataSet chartData)
{
const int SIDE_LENGTH = ;
const int CHART_TOP = ;
const int CHART_HEIGHT = ;
const int CHART_LEFT = ;
const int CHART_WIDTH = ;
DataTable dt = chartDataTables[];
//计算最高的点
float highPoint = ;
foreach(DataRow dr in dtRows)
{
if(highPoint<ConvertToSingle(dr[]))
{
highPoint = ConvertToSingle(dr[]);
}
}
//建立一个Graphics对象实例
Bitmap bm = new Bitmap(widthheight);
try
{
Graphics g = GraphicsFromImage(bm);
//设置条图图形和文字属性
gScaleTransform((ConvertToSingle(width))/SIDE_LENGTH(ConvertToSingle(height))/SIDE_LENGTH);
gSmoothingMode = SmoothingModeDefault;
gTextRenderingHint = TextRenderingHintAntiAlias;
//设定画布和边
gClear(ColorWhite);
gDrawRectangle(PensBlackSIDE_LENGTHSIDE_LENGTH);
//画大标题
gDrawString(titlenew Font(Tahoma)BrushesBlacknew PointF());
//画小标题
gDrawString(subTitlenew Font(Tahoma)BrushesBlacknew PointF());
//画条形图
float barWidth = CHART_WIDTH / (dtRowsCount * );
PointF barOrigin = new PointF(CHART_LEFT + (barWidth / ));
float barHeight = dtRowsCount;
for(int i=;i<dtRowsCount;i++)
{
barHeight = ConvertToSingle(dtRows[i][]) * / highPoint * ;
barOriginY = CHART_TOP + CHART_HEIGHT barHeight;
gFillRectangle(new SolidBrush(ChartUtilGetChartItemColor(i))barOriginXbarOriginYbarWidthbarHeight);
barOriginX = barOriginX + (barWidth * );
}
//设置边
gDrawLine(new Pen(ColorBlack)new Point(CHART_LEFTCHART_TOP)new Point(CHART_LEFTCHART_TOP + CHART_HEIGHT));
gDrawLine(new Pen(ColorBlack)new Point(CHART_LEFTCHART_TOP + CHART_HEIGHT)new Point(CHART_LEFT + CHART_WIDTHCHART_TOP + CHART_HEIGHT));
//画图例框和文字
gDrawRectangle(new Pen(ColorBlack));
gDrawString(图表说明new Font(TahomaFontStyleBold)BrushesBlacknew PointF());
//画图例
PointF boxOrigin = new PointF();
PointF textOrigin = new PointF();
for(int i=;i<dtRowsCount;i++)
{
gFillRectangle(new SolidBrush(ChartUtilGetChartItemColor(i))boxOriginXboxOriginY);
gDrawRectangle(PensBlackboxOriginXboxOriginY);
gDrawString(dtRows[i][]ToString() + + dtRows[i][]ToString()new Font(Tahoma)BrushesBlacktextOrigin);
boxOriginY += ;
textOriginY += ;
}
//输出图形
gDispose();
return bm;
}
catch
{
return bm;
}
}
}
public class ChartUtil
{
public ChartUtil()
{
}
public static Color GetChartItemColor(int itemIndex)
{
Color selectedColor;
switch(itemIndex)
{
case :
selectedColor = ColorBlue;
break;
case :
selectedColor = ColorRed;
break;
case :
selectedColor = ColorYellow;
break;
case :
selectedColor = ColorPurple;
break;
default:
selectedColor = ColorGreen;
break;
}
return selectedColor;
}
}
}
以上是一个完整的WinForm中制作饼状图和柱状图源程序大家可以通过以上程序的更改做出能满足自己程序的需要