gid+实现多种统计图 ,支持负坐标

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  EI.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();
           bp.Dispose();
           fs.Close();
         
return  "<img src="+Page.Request.Url.AbsolutePath.Replace(".aspx",".jpg")+" ></img>";

       }


        
#endregion




        
画住状图 


    
        
画 X,Y 轴 线和刻度
        
    
        
画 柱状 x,y  刻度
         
        
饼状图


}

}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值