📄 chart.cs
字号:
using System;
using System.IO;
using System.Data;
using System.Drawing;
using System.Drawing.Text;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace eBookShop.BLL
{
/// <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 + -