类文件:Dashboard_class.cs
public string Render(string title, string currency, int width, int height,List<BarChartValue> Mydata, List<BarChartValue> Mydata1)
{
const int SIDE_LENGTH = 200;
const int CHART_TOP = 25;
const int CHART_HEIGHT = 100;
const int CHART_LEFT =30;
const int CHART_WIDTH =150;
// 计算最高的点
float highPoint = 0;
for (int i = 0; i < Mydata1.Count; i++)
{
if (highPoint < Convert.ToSingle(Mydata1[i].MValue))
{
highPoint = Convert.ToSingle(Mydata1[i].MValue);
}
}
//建立一个Graphics对象实例
Bitmap bm = new Bitmap(width, height);
Graphics g = Graphics.FromImage(bm);
//设置条图图形和文字属性
g.ScaleTransform((Convert.ToSingle(width)) / SIDE_LENGTH, (Convert.ToSingle(height)) / SIDE_LENGTH);
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
//g.SmoothingMode = SmoothingMode.Default;
//g.TextRenderingHint = TextRenderingHint.AntiAlias;
//设定画布和边
g.Clear(Color.Transparent);
//画布的边框
//g.DrawRectangle(Pens.White, 0, 0, SIDE_LENGTH - 1, SIDE_LENGTH - 1);
//画大标题
g.DrawString(title, new Font("Tahoma", 6), Brushes.White, new PointF(80, 3));
画小标题
//g.DrawString(subTitle, new Font("Tahoma", 10), Brushes.White, new PointF(7, 35));
//画百分比分割线
g.DrawLine(new Pen(Color.White, -1), new Point(CHART_LEFT, CHART_TOP + CHART_HEIGHT - 19), new Point(CHART_LEFT + CHART_WIDTH, CHART_TOP + CHART_HEIGHT - 19));
g.DrawLine(new Pen(Color.White, -1), new Point(CHART_LEFT, CHART_TOP + CHART_HEIGHT - 39), new Point(CHART_LEFT + CHART_WIDTH, CHART_TOP + CHART_HEIGHT - 39));
g.DrawLine(new Pen(Color.White, -1), new Point(CHART_LEFT, CHART_TOP + CHART_HEIGHT - 59), new Point(CHART_LEFT + CHART_WIDTH, CHART_TOP + CHART_HEIGHT - 59));
g.DrawLine(new Pen(Color.White, -1), new Point(CHART_LEFT, CHART_TOP + CHART_HEIGHT - 79), new Point(CHART_LEFT + CHART_WIDTH, CHART_TOP + CHART_HEIGHT - 79));
g.DrawLine(new Pen(Color.White,-1), new Point(CHART_LEFT, CHART_TOP + CHART_HEIGHT - 99), new Point(CHART_LEFT + CHART_WIDTH, CHART_TOP + CHART_HEIGHT - 99));
//画条形图
float barWidth =8; //柱子宽度
PointF barOrigin = new PointF(CHART_LEFT + (barWidth / 2), 0);
float barHeight = Mydata.Count;
int max = Mydata1[0].MValue;
int min = Mydata1[0].MValue;
for (int o = 0; o < Mydata1.Count; o++)
{
if (Mydata1[o].MValue > max)
max = Mydata1[o].MValue;
if (Mydata1[o].MValue < min)
min = Mydata1[o].MValue;
}
//Y轴分5段,求平均值
int avg = max / 5;
System.Drawing.Image newImage;
//int avg = 800000;
for (int i = 0; i < Mydata.Count; i++)
{
//barHeight = Convert.ToSingle(Mydata[i].MValue) * 75 / highPoint * 1;
barHeight = Convert.ToSingle(Mydata[i].MValue) * 100 / highPoint * 1; //控制柱子的高度,修改数字75即可。
barOrigin.Y = CHART_TOP + CHART_HEIGHT - barHeight;
if (Mydata[i].MValue < (avg * 1))
{
//用图片填充柱子
newImage = System.Drawing.Image.FromFile(@"F:/test/Images/bar_chart_red.png");
g.DrawImage(newImage, barOrigin.X-2, barOrigin.Y, barWidth+5, barHeight);//柱子X,Y轴坐标,宽高
//g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(0)), barOrigin.X, barOrigin.Y, barWidth, barHeight);
}
else if (Mydata[i].MValue >= (avg * 1) & Mydata[i].MValue < (avg * 1.5))
{
newImage = System.Drawing.Image.FromFile(@"F:/test/Images/bar_chart_yellow.png");
g.DrawImage(newImage, barOrigin.X-2, barOrigin.Y, barWidth+5, barHeight);
//g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(1)), barOrigin.X, barOrigin.Y, barWidth, barHeight);
}
else
{
newImage = System.Drawing.Image.FromFile(@"F:/test/Images/bar_chart_green.png");
g.DrawImage(newImage, barOrigin.X-2, barOrigin.Y, barWidth+5, barHeight);
//g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(2)), barOrigin.X, barOrigin.Y, barWidth, barHeight);
}
g.DrawString(Mydata[i].Name, new Font("Tahoma", 4), Brushes.White, new PointF(barOrigin.X, 125));
barOrigin.X = barOrigin.X + (barWidth * 2)-3;
}
//Y轴数据
int yPosition = 150;
for (int j = 0; j < 6; j++)
{
int mo = 28;
string n = (avg * j).ToString();
string num = string_num(n);
if (j == 0)
{
g.DrawString(num, new Font("Tahoma", 4), Brushes.White, 25, yPosition -= mo);
}
else if (j == 1)
{
mo = 21;
g.DrawString(num, new Font("Tahoma", 4), Brushes.White, 9, yPosition -= mo);
}
else
{
mo = 21;
g.DrawString(num, new Font("Tahoma", 4), Brushes.White, 4, yPosition -= mo);
}
}
g.DrawString(currency.ToString(), new Font("Tahoma", 4), Brushes.White, 24, 10);
//Y轴边线
g.DrawLine(new Pen(Color.White, -1), new Point(CHART_LEFT, CHART_TOP-10), new Point(CHART_LEFT, CHART_TOP + CHART_HEIGHT));
//g.DrawLine(new Pen(Color.White, 1), new Point(CHART_LEFT + CHART_WIDTH, CHART_TOP), new Point(CHART_LEFT + CHART_WIDTH, CHART_TOP + CHART_HEIGHT));
//X轴边线
g.DrawLine(new Pen(Color.White, -1), new Point(CHART_LEFT, CHART_TOP + CHART_HEIGHT), new Point(CHART_LEFT + CHART_WIDTH, CHART_TOP + CHART_HEIGHT));
//输出图形
g.Dispose();
//此处存储路径需要自己改
System.Drawing.Image MyImage = (System.Drawing.Image)bm;
string TruePath = System.Web.HttpContext.Current.Server.MapPath("~/images");
string TrueName = DateTime.Now.ToString("yyyyMMddhhmmss") + DateTime.Now.Millisecond;
MyImage.Save(TruePath + "//" + TrueName + ".png", System.Drawing.Imaging.ImageFormat.Gif);
return "~/images/" + TrueName + ".png";
}
/// <summary>
/// 数据源是PieChartValue对象的饼状图
/// </summary>
/// <param name="title">饼状图大标题</param>
/// <param name="subTitle">饼状图小标题</param>
/// <param name="width">图宽</param>
/// <param name="height">图高</param>
/// <param name="Mydata">PieChartValue对象</param>
/// <returns>饼状图路径</returns>
public string Render_pie(string title, string subTitle, int width, int height, List<BarChartValue> Mydata)
{
const int SIDE_LENGTH = 180;
const int PIE_DIAMETER =60;
//DataTable dt = DataTable;
//通过输入参数,取得饼图中的总基数
float sumData = 0;
for (int i = 0; i < Mydata.Count; i++)
{
sumData += Convert.ToSingle(Mydata[i].MValue);
}
//产生一个image对象,并由此产生一个Graphics对象
Bitmap bm = new Bitmap(width, height);
Graphics g = Graphics.FromImage(bm);
//设置对象g的属性
g.ScaleTransform((Convert.ToSingle(width)) / SIDE_LENGTH, (Convert.ToSingle(height)) / SIDE_LENGTH);
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
//画布和边的设定
g.Clear(Color.Transparent);
//g.DrawRectangle(Pens.Black, 0, 0, SIDE_LENGTH - 1, SIDE_LENGTH - 1);
//画饼图标题
g.DrawString(title, new Font("Tahoma", 6), Brushes.White, new PointF(25, 20));
//画饼图的图例
//g.DrawString(subTitle, new Font("Tahoma", 12), Brushes.White, new PointF(7, 35));
//画饼图
float curAngle = 0;
float totalAngle = 0;
System.Drawing.Image newImage;
newImage = System.Drawing.Image.FromFile(@"F:/test/Images/480_chat_bg.png");
//g.DrawImage(newImage, 17, 32, 75, 75);
for (int j = 0; j < Mydata.Count; j++)
{
curAngle = Convert.ToSingle(Mydata[j].MValue) / sumData * 360;
//填充颜色,X,Y,饼宽,饼高)
g.FillPie(new SolidBrush(ChartUtil.GetChartItemColor_pie(j)), 20, 35, PIE_DIAMETER-12, PIE_DIAMETER+12, totalAngle, curAngle);
//g.DrawPie(Pens.Black, 100, 65, PIE_DIAMETER, PIE_DIAMETER, totalAngle, curAngle);
totalAngle += curAngle;
}
//画图例框及其文字
//g.DrawRectangle(Pens.Black, 200,100, 199, 99);
//g.DrawString("图表说明", new Font("Tahoma", 12, FontStyle.Bold), Brushes.White, new PointF(200, 300));
//画图例各项
PointF boxOrigin = new PointF(90, 10); //填充颜色图标坐标(X,Y)
PointF textOrigin = new PointF(95, 8); //name坐标(X,Y)
PointF textOrigin1 = new PointF(125, 8);//value坐标(X,Y)
float percent = 0;
for (int k = 0; k < Mydata.Count; k++)
{
string Mvalue=string_num(Mydata[k].MValue.ToString());
g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor_pie(k)), boxOrigin.X, boxOrigin.Y, 3, 3);
percent = Convert.ToSingle(Mydata[k].MValue) / sumData * 100;
g.DrawString(Mydata[k].Name.ToString() ,new Font("Tahoma", 5), Brushes.White, textOrigin);
g.DrawString(subTitle + " " + Mvalue, new Font("Tahoma", 5), Brushes.White, textOrigin1);
boxOrigin.Y += 12;
textOrigin.Y += 12;
textOrigin1.Y += 12;
}
//回收资源
g.Dispose();
//此处存储路径需要自己改
System.Drawing.Image MyImage = (System.Drawing.Image)bm;
string TruePath = System.Web.HttpContext.Current.Server.MapPath("~/images");
string TrueName = DateTime.Now.ToString("yyyyMMddhhmmss") + DateTime.Now.Millisecond;
MyImage.Save(TruePath + "//" + TrueName + ".jpg", System.Drawing.Imaging.ImageFormat.Gif);
return "~/images/" + TrueName + ".jpg";
}
类文件:BarChartValue.cs
public class BarChartValue
{
public BarChartValue()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
public BarChartValue(string MyName, int Myvalue)
{
Name = MyName;
MValue = Myvalue;
}
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
private int mvalue;
public int MValue
{
get
{
return mvalue;
}
set
{
mvalue = value;
}
}
}
类文件: ChartUtil.cs
public static Color GetChartItemColor_pie(int itemIndex)
{
Color selectedColor;
switch (itemIndex)
{
case 0:
selectedColor = Color.DeepSkyBlue;
break;
case 1:
selectedColor = Color.DarkOrange;
break;
case 2:
selectedColor = Color.PaleGreen;
break;
case 3:
selectedColor = Color.Red;
break;
case 4:
selectedColor = Color.DarkOrchid;
break;
case 5:
selectedColor = Color.DarkSalmon;
break;
case 6:
selectedColor = Color.DarkSeaGreen;
break;
case 7:
selectedColor = Color.DarkViolet;
break;
case 8:
selectedColor = Color.DimGray;
break;
case 9:
selectedColor = Color.DarkTurquoise;
break;
case 10:
selectedColor = Color.DarkOliveGreen;
break;
default:
selectedColor = Color.Black;
break;
}
return selectedColor;
}
C# 调用方法:
DataView dv = new DataView();
dv = ds.Tables[2].DefaultView;
dv.RowFilter = "Item_Id='"+item_id+"'";
string s = "";
List<BarChartValue> list_arrary = new List<BarChartValue>();
foreach (DataRowView item in dv)
{
list_arrary.Add(new BarChartValue(item["name"].ToString(), Convert.ToInt32(item["value"])));
}
Image1.ImageUrl = dash.Render(title, currency, 500, 300, list_arrary, list);