近来项目中需要用饼状图表示一些东东,我才想起来,曾经我还改过一个生成图表的控件,翻开电脑找了半天终于找到了,幸亏上次格盘时保存了下来,他可以生成柱状图,曲线图,饼状图,只要你给他一个datatable,在这声明一下这个控件源码是我从网上找的,然后自己又改了30%的代码,优化了一下,现在就与大家分享一下这个控件的源码
using System;
using System.Web.UI;
using System.Data;
using System.Web.UI.WebControls;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Web;
using System.ComponentModel;
using System.Collections;

namespace hya.Control


{

/**//// <summary>
/// 柱状图控件
/// 需要传入列表项名,值,超级连接地址
/// </summary>
[ToolboxData("<{0}:Columniation runat=server></{0}:Columniation>")]
public class Columniation : System.Web.UI.WebControls.WebControl

{
private const int _colorLimit = 12; //颜色列表
private Color[] _color =

{
Color.Chocolate,
Color.YellowGreen,
Color.Olive,
Color.DarkKhaki,
Color.Sienna,
Color.PaleGoldenrod,
Color.Peru,
Color.Tan,
Color.Khaki,
Color.DarkGoldenrod,
Color.Maroon,
Color.OliveDrab
};




private DataTable items;//列表项名称和值


private string text = "数据";
private string datastd = "标准值";
private string data = "实时数据";


int kds = 10; //刻度数
float kddw = 100; //没刻度大小

int zmheight = 500; //真个图区高
int zmwidth = 740; //真个图区宽

int height = 400;//呈现区高
int width = 730;
int cxtop = 30;//呈现区距顶距离
int cxleft = 30;//呈现区左边距离

Color bzlink = Color.Black;//标准线颜色


int Chart_Flag = 1;
Bitmap bm;

int Displacement = 0; //获取负坐标刻度数




[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public string Text

{
get

{
return text;
}

set

{
text = value;
}
}

[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public string DataStdName

{
get

{
return datastd;
}

set

{
datastd = value;
}
}

[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public string DataName

{
get

{
return data;
}

set

{
data = value;
}
}


/**//// <summary>
/// 需要呈现的数据
/// </summary>
public DataTable Items

{
set

{ items = value; }
}


/**//// <summary>
/// 需要显示的刻度量
/// </summary>
public int Kdcount

{

set
{ kds = value; }
}


/**//// <summary>
/// 刻度大小
/// </summary>

public float Kddw

{ set
{ kddw = value; } }



public int ChatStyle

{ set
{ this.Chart_Flag = value; } }



/**//// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param text="output"> 要写出到的 HTML 代码 </param>
protected override void Render(HtmlTextWriter output)

{
//if(dt==null)
//{
// return "没有数据";
//}
//设计样式
kd(items);
output.Write(makeimage(items, "c:/"));


}

private string makeimage(DataTable dt, string imagefile)

{


string url = "";

switch (Chart_Flag)

{
case 1:

{

this.Draw_X_Y_Bar(dt);
url = this.Drar_Bar(dt);

break;
}
case 2:

{


this.Draw_X_Y(dt);
url = this.Drow_Lin(dt);

break;
}
case 3:

{

url = this.Draw_Pie(dt);
break;
}

}

return url;


}

/**//// <summary>
/// 换算成实际值
/// </summary>
/// <param text="kd">提供的值</param>
/// <returns>返回换算后的实际值</returns>
private float bl(float kd)

{
float bls = 1;
bls = (float)height / ((float)kds * (float)kddw);
return (float)kd * bls;
}



//通过数据计算刻度,和负坐标数#region //通过数据计算刻度,和负坐标数

private void kd(DataTable dt)

{
float mintest = float.MaxValue;
float maxtest = float.MinValue;

float maxnegative = 0f;


for (int j = 1; j < dt.Columns.Count; j++)

{
for (int i = 0; i < dt.Rows.Count; i++)

{
float test = System.Convert.ToSingle(dt.Rows[i][j]);
//求最小值
if (test < 0 && test < maxnegative)

{
maxnegative = test;
}
//求最大值
if (test > maxtest)

{
maxtest = test;
}
}
}

maxtest = maxtest + Math.Abs(maxnegative);

// this.Page .Response .Write (maxtest);

kddw = maxtest / kds;





double exp = Convert.ToDouble(Math.Floor(Math.Log10(maxtest)));

// this.Page .Response .Write ("exp"+exp.ToString ()+"<br>");
float tempMax = Convert.ToSingle(Math.Ceiling(maxtest / Math.Pow(10, exp)) * Math.Pow(10, exp));

// this.Page .Response .Write ("temp_Max"+exp.ToString ()+"<br>");


kddw = tempMax / kds;
double expTick = Convert.ToDouble(Math.Floor(Math.Log10(kddw)));
kddw = Convert.ToSingle(Math.Ceiling(kddw / Math.Pow(10, expTick)) * Math.Pow(10, expTick));
this.Displacement = Math.Abs((int)Math.Floor(maxnegative / kddw));
// this.Page .Response.Write (this.Displacement);


}

#endregion



//

绘制折线图#region 绘制折线图

private string Drow_Lin(DataTable dt)

{


//通过循环画出曲线图
int x = -1;
int bzy = -1;



Graphics bp = Graphics.FromImage(bm);
for (int j = 1; j < dt.Columns.Count; j++)

{
for (int i = 0; i < dt.Rows.Count; i++)

{

//标准刻度



float bzkd = bl(System.Convert.ToSingle(dt.Rows[i].ItemArray[j]));
//实际刻度
// float sjkd=bl(System.Convert.ToSingle(dt.Rows[i].ItemArray[2]));

int bztop = cxtop + height - (int)bzkd - 3 - (int)(bl(this.Displacement * kddw));
//填充标准柱(画刷,起点X,起点Y,宽,高)



bp.FillRectangle(new SolidBrush(_color[j - 1]), (i * 40) + cxleft + 20 - 3, bztop, 6, 6);
// int sstop=zmheight-(int)sjkd-(zmheight-cxtop-height)-3;
//填充实时点(画刷,起点X,起点Y,宽,高)
// bp.FillRectangle(new SolidBrush(ss),(i*30)+cxleft,sstop,6,6);

//绘制点到点连接线
if (x != -1)

{
//绘制标准点连接线

bp.DrawLine(new Pen(_color[j - 1], 1.6F), new Point(x, bzy), new Point((i * 40) + cxleft + 20, bztop));
//绘制实时点连接线
// bp.DrawLine(new Pen(ss,1.6F),new Point(x+3,ssy+4),new Point((i*30)+cxleft+10,sstop+4));
}
x = (i * 40) + cxleft + 20;
bzy = bztop;
// ssy=sstop;
// bp.DrawString(dt.Rows[i].ItemArray[0].ToString (),new Font("宋体",9),new SolidBrush(Color.Black),new PointF((i*40)+cxleft+10,height+cxtop+1));


}

x = -1;
}
FileStream fs = new FileStream(Page.Server.MapPath(Page.Request.Url.AbsolutePath.Replace(".aspx", ".jpg")), FileMode.Create);
bm.Save(fs, ImageFormat.Jpeg);

bm.Dispose();
&nb