.net之生成图表的控件(柱状图,曲线图,饼状图)

  近来项目中需要用饼状图表示一些东东,我才想起来,曾经我还改过一个生成图表的控件,翻开电脑找了半天终于找到了,幸亏上次格盘时保存了下来,他可以生成柱状图,曲线图,饼状图,只要你给他一个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;
        }



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



        
//
        绘制折线图



        
画住状图



        
画 X,Y 轴 线和刻度


        
画 柱状 x,y  刻度

        
饼状图


    }

}


在调用时很简单, 首先将它编译成控件,在aspx页添加引用
 

<%@ Register TagPrefix="cc1" Namespace="hya.Control" Assembly="Columniation" %>


在你需要显示图表的地方添加如下标签:

<cc1:Columniation id="Columniation1" runat="server"></cc1:Columniation>

在对应的.cs页写下如下的代码

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;



public partial class _Default : System.Web.UI.Page 
{

        
private void Page_Load(object sender, System.EventArgs e)
        
{
            
// 在此处放置用户代码以初始化页面
            DataTable dt = new DataTable();
            DataColumn dc;

            dc 
= new DataColumn();
            dc.DataType 
= System.Type.GetType("System.String");
            dc.ColumnName 
= "name";
            dt.Columns.Add(dc);



            dc 
= new DataColumn();
            dc.DataType 
= System.Type.GetType("System.Int32");
            dc.ColumnName 
= "db";
            dt.Columns.Add(dc);

         dc 
= new DataColumn();
           dc.DataType 
= System.Type.GetType("System.Int32");
           dc.ColumnName 
= "df";
            dt.Columns.Add(dc);

            dc 
= new DataColumn();
          dc.DataType 
= System.Type.GetType("System.Int32");
           dc.ColumnName 
= "dz";
           dt.Columns.Add(dc);




            DataRow dr 
= dt.NewRow();

            dr[
"name"= "点1";

            dr[
"db"= "1000";
           dr[
"df"= "500";
          dr[
"dz"= "240";
            dt.Rows.Add(dr);

            dr 
= dt.NewRow();
            dr[
"name"= "点2";

            dr[
"db"= "200";
           dr[
"df"= "200";
         dr[
"dz"= "240";
            dt.Rows.Add(dr);

            dr 
= dt.NewRow();
            dr[
"name"= "点3";

            dr[
"db"= "300";
          dr[
"df"= "600";
          dr[
"dz"= "240";
            dt.Rows.Add(dr);


            dr 
= dt.NewRow();
            dr[
"name"= "点4";

            dr[
"db"= "200";
            dr[
"df"= "1500";
           dr[
"dz"= "240";
            dt.Rows.Add(dr);

            dr 
= dt.NewRow();
            dr[
"name"= "点5";

            dr[
"db"= "400";
         dr[
"df"= "2400";
         dr[
"dz"= "240";
            dt.Rows.Add(dr);









        
            Columniation1.Items 
= dt;
            Columniation1.ChatStyle 
= 3;  //1 为柱状,2 为折线,3为屏状 



    }

}



其生成的饼状图如下:


其生成的柱状图如下:

其生成的折线图如下:
 

posted @ 2008-05-23 09:13  浪子の无悔  阅读(1298)  评论(4编辑  收藏  举报