⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chart.cs

📁 精通SQL Server2005项目开发
💻 CS
字号:
using System;
using System.IO;
using System.Data;
using System.Drawing;
using System.Drawing.Text;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

using MyBookShop.DataAccessHelper;

namespace MyBookShop.BusinessLogicLayer
{
	/// <summary>
	/// 一个通用的画饼图的类
	/// </summary>
	public class Chart
	{
		private const int SIDE_LENGTH=400;
		private const int PIE_DIAMETER=200;

		/// <summary>
		/// 画饼图方法
		/// </summary>
		/// <param name="title">饼图标题</param>
		/// <param name="subTitle">子标题</param>
		/// <param name="width">宽</param>
		/// <param name="height">高</param>
		/// <param name="dt">数据来源表</param>
		/// <param name="targetFile">生成的图形保存目标文件</param>
		/// <param name="descColumn">文字说明列</param>
		/// <param name="dataColumn">显示在统计图上的数据列名</param>
		public static void DrawPie(string title,string subTitle,int width,int height,DataTable dt,string targetFile,string descColumn,string dataColumn)
		{
			//创建一个位图对象
			Bitmap bm=new Bitmap(width,height);
			Graphics g=Graphics.FromImage(bm);
 
			//将图象"缩放"到指定面积
			g.ScaleTransform(Convert.ToSingle(width)/SIDE_LENGTH,Convert.ToSingle(height)/SIDE_LENGTH);
 
			//画饼图所在的线框
			g.Clear(Color.White);
			g.DrawRectangle(Pens.Black,0,0,SIDE_LENGTH-1,SIDE_LENGTH-1);
 
			//画标题title,副标题subTitle
			g.DrawString(title,new Font("宋体",14),Brushes.Black,new PointF(5,5)); 
			g.DrawString(subTitle,new Font("宋体",12),Brushes.Black,new PointF(7,35));
 
			//画饼图
			float curAngle=0;		//当前所画到的角度
			float totalAngle=0;		//总的角度
			float sumData=0;		//计算所要统计的数据之和
			
			//计算所要统计的数据之和
			foreach(DataRow dr in dt.Rows)
			{
				if(dr[dataColumn]!=DBNull.Value)
					sumData+=Convert.ToSingle(dr[dataColumn]);
			}

			//循环画出每一个扇形,以及其说明
			int colorIndex=0;		//颜色
			float percent=0;		//每一个种类的百分比
			g.DrawRectangle(Pens.Black,100,270,300,130);	//说明线框
			PointF boxOrigin=new PointF(110,275);			//说明标签起始位置
			PointF textOrigin=new PointF(135,275);			//说明文字起始位置

			//循环画出每一个扇形
			foreach(DataRow row in dt.Rows)
			{
				if(row[dataColumn]!=System.DBNull.Value)
				{
					colorIndex++;

					//扇形
					curAngle=Convert.ToSingle(row[dataColumn])/sumData*360;
					g.FillPie(new SolidBrush(GetColor(colorIndex)),100,60,PIE_DIAMETER,PIE_DIAMETER,totalAngle,curAngle);
					g.DrawPie(Pens.Black,100,60,PIE_DIAMETER,PIE_DIAMETER,totalAngle,curAngle);
					totalAngle+=curAngle;

					//标签
					g.FillRectangle(new SolidBrush(GetColor(colorIndex)),boxOrigin.X,boxOrigin.Y,20,10);
					g.DrawRectangle(Pens.Black,boxOrigin.X,boxOrigin.Y,20,10);
 
					//说明
					percent=Convert.ToSingle(row[dataColumn])/sumData*100;
					g.DrawString(
						row[descColumn].ToString()+"("+percent.ToString("0.0")+"%)",
						new Font("宋体",12),Brushes.Black,textOrigin
						);

					boxOrigin.Y+=20;
					textOrigin.Y+=20;
				}
			}
	
			//将生成的图保存到target
			bm.Save(targetFile,ImageFormat.Gif);
 
			//释放资源
			bm.Dispose();
			g.Dispose();
		}

		/// <summary>
		/// 生成颜色的方法
		/// </summary>
		/// <param name="itemIndex"></param>
		/// <returns></returns>
		public static Color GetColor(int idx)
		{
			idx*=60;
			int r=idx%255;
			int g=((255/3)+idx)%255;
			int b=((255*2/3)+idx)%255;
			return Color.FromArgb(r,g,b);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -