以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  用GDI+来画报表图,并用在WEB上  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=8277)


--  作者:cwzb
--  发布时间:6/14/2004 1:03:00 PM

--  用GDI+来画报表图,并用在WEB上

此主题相关图片如下:
按此在新窗口浏览图片


此主题相关图片如下:
按此在新窗口浏览图片


此主题相关图片如下:
按此在新窗口浏览图片
//可能大家会觉得这张图片难看。呵呵。因为数据不大合理,所以画出来的线也是乱七八糟的。

//关于这个画图的东西,有一个问题:字不能斜。这个我在下面也做了审明。不过我会尽快把它处理掉。

[此贴子已经被作者于2004-6-14 13:28:01编辑过]

--  作者:cwzb
--  发布时间:6/14/2004 1:08:00 PM

--  
以上是做好后的次果图片;
我先把代码先放上去,日后,再进行一些说明。如果朋友们觉得没有必要,那,讲解部门,我就不讲了。
在放代码前,我先介绍代码里一个重要的问题:
1。在第一张图片,跟第三张图片,还不能把字往下斜。不过,我会把它改过来的:)
现在放代码。

我先建了一个库项目,共有五个文件:
1,AnalyseBase.cs
2,DataSource.cs
3,Hismap.cs
4,Linmap.cs
5,Primap.cs
我为这个类库项目取名为:Report;namespace:Biisomsoft.Report.
以下把各文件的源代码贴上去:
1,AnalyseBase.cs
using System;
using System.Drawing;
using System.Drawing.Text;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

namespace Biisomsoft.Report
{
public class AnalyseBase
{
  private DataSource _dataSource;
  public DataSource dataSource
  {
   get
   {
    return _dataSource;
   }
   set
   {
    _dataSource=value;
   }
  }
  private Pen[] _map_pens;//画笔
  protected Pen[] map_pens
  {
   get
   {
    return _map_pens;
   }
  }
  private Font _font;
  protected Font font
  {
   get
   {
    return this._font;
   }
  }

  private Bitmap _map_canvas;//画布
  protected Bitmap map_canvas
  {
   get
   {
    return _map_canvas;
   }    
  }


  
  //////////////////////////////////////////////////
  

  protected AnalyseBase(){}

  protected void DataBind()
  {
   this._map_canvas=new Bitmap(this._dataSource.map_width,this._dataSource.map_hieght);
   this._map_pens  =new Pen[]{Pens.Blue,
            Pens.Red,
            Pens.Green,
            Pens.Orange,
            Pens.Black,
            Pens.Purple,
            Pens.SlateGray,
            Pens.Olive,
            Pens.DarkSlateBlue,
            Pens.Violet,
            Pens.CadetBlue,
            Pens.Goldenrod,
            Pens.DarkGreen,
            Pens.Brown,
            Pens.HotPink,
            Pens.BlueViolet,
           };
   this._font      =new Font("宋体",9);
  }
  public virtual Bitmap CreateMap()
  {
   return null;
  }
}
}

2,DataSource.cs

using System;

namespace Biisomsoft.Report
{
/// <summary>
/// DataSource 的摘要说明。
/// </summary>
public class DataSource
{
  #region  -- 画布大小 --
  private int _map_width;
  public int map_width
  {
   get
   {
    return _map_width;
   }
   set
   {
    _map_width=value;
   }
  }
  private int _map_hieght;
  public int map_hieght
  {
   get
   {
    return _map_hieght;
   }
   set
   {
       _map_hieght=value;
   }
  }
  #endregion 画布大小

  #region 定义折线图的数据源
  private string[] _lin_titles;
  public string[] lin_titles
  {
   get
   {
    return _lin_titles;
   }
   set
   {
    _lin_titles=value;
   }
  }
  private string[] _lin_texts;
  public string[] lin_texts
  {
   get
   {
    return _lin_texts;
   }
   set
   {
    _lin_texts=value;
   }
  }
  private float[,] _lin_values;
  public float[,] lin_values
  {
   get
   {
    return _lin_values;
   }
   set
   {
    _lin_values=value;
   }
  }

  #endregion 定义折线图的数据源

  #region 饼图与柱图的数据源
  private string[] _texts;
  public string[] pri_texts
  {
   get
   {
    return _texts;
   }
   set
   {
    _texts=value;
   }
  }
  public string[] his_texts
  {
   get
   {
    return _texts;
   }
   set
   {
    _texts=value;
   }
  }

  private float[] _values;
  public float[] pri_values
  {
   get
   {
    return _values;
   }
   set
   {
    _values=value;
   }
  }
  public float[] his_values
  {
   get
   {
    return _values;
   }
   set
   {
    _values=value;
   }
  }
  #endregion 饼图与柱图的数据源

  public DataSource()
  {
   this._map_width =650;
   this._map_hieght=400;
  }
}
}


3,Hismap.cs

using System;
using System.Drawing;
using System.Drawing.Text;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

namespace Biisomsoft.Report
{
/// <summary>
/// Hismap 的摘要说明。
/// </summary>
public class Hismap:AnalyseBase
{  

  public override Bitmap CreateMap()
  {
   base.DataBind();

   string[] texts=base.dataSource.his_texts;   
   float[] valus =base.dataSource.his_values;
   Pen[]  pens   =base.map_pens;

   Graphics g=Graphics.FromImage(base.map_canvas);
  
   //给出数据源

   int area_width =570;//
   int area_hieght=300;
   
   int defalt_span=80; //作为数据源的可控部份

   if(area_width>texts.Length*defalt_span)
    area_width=texts.Length*defalt_span;
  
   Rectangle area=new Rectangle(50,50,area_width,area_hieght);

   g.Clear(Color.Snow);
   g.SmoothingMode=SmoothingMode.AntiAlias;
   g.DrawRectangle(Pens.Black,area);
   g.FillRectangle(new LinearGradientBrush(area,Color.Snow,Color.LightSteelBlue,LinearGradientMode.BackwardDiagonal),
    area.X,
    area.Y-1,
    area.Width+2,
    area.Height+1);
   //画出区域

   int y_count=5;
   int y_width=20;
   int y_span   =area.Height/y_count;
   long y_top  =(this.Work_Top(valus)/10)*11;
   int his_side;//柱的底面边长

   if(valus.Length>16)
   {
    g.DrawString("我感到非常抱歉,因为我只能帮你显示16支以内的柱子。建议更改分析段!谢谢。",base.font,Brushes.Red,area.Left+20,area.Height/2);
    return base.map_canvas;
   }//如果要画的柱子多于16,装先行退出程序

   if(texts.Length<10)
    his_side=30;
   else
   {
    his_side=((area_width-20)/texts.Length)/2-1;
   }

   Pen line_pen=Pens.Blue;
   for(int i=0;i<y_count;i++)
   {
    g.DrawLine(Pens.Black,area.Left-y_width,area.Y+y_span*i,area.Left           ,area.Y+y_span*i);
    
    g.DrawLine(line_pen,area.Left           ,area.Y+y_span*(i+1)           ,area.Left+his_side/2,area.Y+y_span*(i+1)-his_side/2);
    g.DrawLine(line_pen,area.Left+area.Width,area.Y+y_span*(i+1)-his_side/2,area.Left+his_side/2,area.Y+y_span*(i+1)-his_side/2);

    g.DrawString(Convert.ToString(y_top-y_top/y_count*i),base.font,Brushes.Black,area.Left-y_width*2,area.Y+y_span*i,StringFormat.GenericTypographic);
   }
   g.DrawLine(line_pen,area.Left+his_side/2,area.Bottom-his_side/2,area.Left+his_side/2,area.Top);
   //画出Y轴

   int x_count =texts.Length;  
   int x_span  =area.Width/x_count;
   
   int   his_span  =his_side*2/3;
   float his_hieght=0;
   RectangleF   temp_r;
   GraphicsPath temp_p;
   for(int i=0;i<x_count;i++)
   {
    if(valus[i]<1)
     his_hieght=1;
    else
     his_hieght=valus[i];

    temp_r=new RectangleF(area.Left+his_span+(his_side*3/2+his_span)*i,area.Bottom-(area.Height*(his_hieght/y_top)),his_side,(area.Height*(his_hieght/y_top)));
    temp_p=new GraphicsPath(new PointF[]{
                new PointF(temp_r.Left             ,temp_r.Top),
                new PointF(temp_r.Left+his_side/2  ,temp_r.Top-his_side/2),
                new PointF(temp_r.Left+his_side*3/2,temp_r.Top-his_side/2),
                new PointF(temp_r.Left+his_side*3/2,temp_r.Bottom-his_side/2),
                new PointF(temp_r.Left+his_side    ,temp_r.Bottom),
                new PointF(temp_r.Left+his_side    ,temp_r.Top)
               },
     new byte[]
            {
             (byte)PathPointType.Start,
             (byte)PathPointType.Line,
             (byte)PathPointType.Line,
             (byte)PathPointType.Line,
             (byte)PathPointType.Line,
             (byte)PathPointType.Line
            });

    g.FillRectangle(new LinearGradientBrush(temp_r,Color.Snow,pens[i].Color,LinearGradientMode.BackwardDiagonal),temp_r);
    g.FillPath(new SolidBrush(pens[i].Color),temp_p);
    g.DrawString(texts[i],base.font,Brushes.Black,temp_r.Left,area.Bottom+2,new StringFormat(StringFormatFlags.DirectionVertical));
    g.DrawString(valus[i].ToString(),base.font,Brushes.Black,temp_r.Left+his_side/2,temp_r.Top-his_side);
   }
   //画出柱子
            
   return base.map_canvas;
  }
  private int Work_Top(float[] valus)
  {
   int temp=0;
   for(int i=0;i<valus.GetLength(0);i++)
   {
    if(temp<valus[i])
     temp=(int)valus[i];
   }
   
   temp=(int.Parse(temp.ToString().Substring(0,1))+1)*(int)Math.Pow(10,temp.ToString().Length-1);
   if(temp<2)
    return 100;
   else
                return (temp);
  }
}
}

4,Linmap.cs

using System;
using System.Drawing;
using System.Drawing.Text;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

namespace Biisomsoft.Report
{
/// <summary>
/// Linmap 的摘要说明。
/// </summary>
public class Linmap:AnalyseBase
{
  
  public override Bitmap CreateMap()
  {
   base.DataBind();

   string[] texts =base.dataSource.lin_texts;
   string[] titles=base.dataSource.lin_titles;
   float[,] valus =base.dataSource.lin_values;
   Pen[]  pens    =base.map_pens;

   Graphics g=Graphics.FromImage(base.map_canvas);
  
   //给出数据源

   int area_width =520;//
   int area_hieght=300;
   int defalt_span=80; //作为数据源的可控部份

   if(area_width>texts.Length*defalt_span)
    area_width=texts.Length*defalt_span;
  
   Rectangle area=new Rectangle(50,50,area_width,area_hieght);

   g.Clear(Color.Snow);
   g.SmoothingMode=SmoothingMode.AntiAlias;
   g.DrawRectangle(Pens.Black,area);
   g.FillRectangle(new LinearGradientBrush(area,Color.Snow,Color.LightSteelBlue,LinearGradientMode.BackwardDiagonal),
    area.X,
    area.Y-1,
    area.Width+1,
    area.Height+1);
   //画出区域
   
   int y_count=5;
   int y_width=20;

   if(valus.GetLength(1)>16)
   {
    g.DrawString("我感到非常抱歉,因为我只能帮你显示16个以内的段。建议更改分析段!谢谢。",base.font,Brushes.Red,area.Left+20,area.Height/2);
    return base.map_canvas;
   }//如果要画的段数多于16,装先行退出程序

   int y_span  =area.Height/y_count;
   long y_top  =(this.Work_Top(valus)/10)*11;

   for(int i=0;i<y_count;i++)
   {
    g.DrawLine(Pens.Black,area.Left-y_width,area.Y+y_span*i,area.Left           ,area.Y+y_span*i);
    g.DrawLine(new Pen(new HatchBrush(HatchStyle.DarkVertical,Color.White,Color.Green),1) ,area.Left       ,area.Y+y_span*i,area.Left+area.Width,area.Y+y_span*i);
    g.DrawString(Convert.ToString(y_top-y_top/y_count*i),base.font,Brushes.Black,area.Left-y_width*2,area.Y+y_span*i);
   }
   //画出Y轴

   int x_count =texts.Length;
   int x_hieght=20;
   int x_span  =area.Width/x_count;
   
   for(int i=0;i<x_count;i++)
   {
    g.DrawLine(Pens.Black,area.Left+x_span*i,area.Bottom,area.Left+x_span*i,area.Bottom+x_hieght);
    g.DrawString(texts[i],base.font,Brushes.Black,area.Left+x_span*i,area.Bottom+2);
   }
   //画出X轴

   for(int i=0;i<valus.GetLength(0);i++)
   {
    for(int j=0;j<x_count-1;j++)
    {
     g.DrawLine(pens[i],
      area.Left+x_span*j,
      area.Bottom-area.Height*(valus[i,j]/y_top),
      area.Left+x_span*(j+1),
      area.Bottom-area.Height*(valus[i,j+1]/y_top));
    }
   }
   //画出折线图

   int block_height=15;
   int block_width =50;
   int block_span  =8;
   Rectangle r=new Rectangle(  area.Right-(x_span*2/3),
    area.Top-block_height*2,
    block_span*2+block_width,
    (block_height+block_span)*valus.GetLength(0)+block_span);
   g.DrawRectangle(Pens.Black,r);
   g.FillRectangle(Brushes.Snow,r);
   for(int i=0;i<valus.GetLength(0);i++)
   {
    g.FillRectangle(new SolidBrush(pens[i].Color),
     r.Left+block_span,
     r.Top+block_span+(block_height+block_span)*i,
     block_width,block_height);
    g.DrawString(  titles[i],
     base.font,Brushes.Black,
     r.Right,
     r.Top+block_span+(block_height+block_span)*i);
   }
   //画出示意目录

   return map_canvas;

   //输出并结束
  }
  private int Work_Top(float[,] valus)
  {
   int temp=0;
   for(int i=0;i<valus.GetLength(0);i++)
   {
    for(int j=0;j<valus.GetLength(1);j++)
    {
     if(temp<valus[i,j])
      temp=(int)valus[i,j];
    }
   }
   
   temp=(int.Parse(temp.ToString().Substring(0,1))+1)*(int)Math.Pow(10,temp.ToString().Length-1);
   if(temp<2)
    return 100;
   else
    return (temp);
  }
        
}
}

5,Primap.cs

using System;
using System.Drawing;
using System.Drawing.Text;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

namespace Biisomsoft.Report
{
/// <summary>
/// Primap 的摘要说明。
/// </summary>
public class Primap:AnalyseBase
{
  
  public override Bitmap CreateMap()
  {
   base.DataBind();

   string[] texts =base.dataSource.pri_texts;
   float[] valus  =base.dataSource.pri_values;
   Pen[]  pens    =base.map_pens;

   Graphics g=Graphics.FromImage(base.map_canvas);

   int area_width =300;//  
   float value_sum=0;
   for(int i=0;i<valus.Length;i++)
   {
    value_sum+=valus[i];
   }
   
   Rectangle area=new Rectangle(80,50,area_width,area_width);
   int area_span=30;

   g.Clear(Color.Snow);
   g.SmoothingMode=SmoothingMode.AntiAlias;
   g.DrawRectangle(Pens.Black,area.Left-area_span,area.Top-area_span,area.Width+area_span*2,area.Height+area_span*2);

   float degree=10;
   double radian;
   float x1,x2,y1,y2;
   int svalue_width=40;
   for(int i=0;i<valus.Length;i++)
   {
    g.FillPie(new LinearGradientBrush(area,Color.White,pens[i].Color,LinearGradientMode.BackwardDiagonal),area,degree,360*(valus[i]/value_sum));
    radian=Math.PI*(180*valus[i]/value_sum+degree)/180;

    x1=(float)(area.Left+area_width/2+(area_width/2-50)*Math.Cos(radian));
    y1=(float)(area.Top +area_width/2+(area_width/2-50)*Math.Sin(radian));
    x2=(float)(area.Left+area_width/2+(area_width/2+15)*Math.Cos(radian));
    y2=(float)(area.Top +area_width/2+(area_width/2+15)*Math.Sin(radian));

    g.DrawLine(  pens[i],x1,y1,x2,y2);
    if(Math.Cos(radian)>0)
    {
     g.DrawLine( pens[i],x2,y2,x2+svalue_width,y2);
     g.DrawString(valus[i].ToString(),base.font,new SolidBrush(pens[i].Color),x2,y2+2);
    }
    else
    {
     g.DrawLine( pens[i],x2,y2,x2-svalue_width,y2);
     g.DrawString(valus[i].ToString(),base.font,new SolidBrush(pens[i].Color),x2-svalue_width,y2+2);
    }
    
     

    degree+=360*(valus[i]/value_sum);
   }
   
   //画出饼块

   int block_width =40;
   int block_hieght=20;
   int block_span  =10;
   Rectangle r=new Rectangle(  area.Right+area_span+block_span,
          area.Top-area_span,
          block_width+block_span*2,
          (block_hieght+block_span)*valus.Length+block_span);

   g.DrawRectangle(Pens.Black,r);
   g.FillRectangle(Brushes.Snow,r);
   for(int i=0;i<valus.Length;i++)
   {
    g.FillRectangle(  new LinearGradientBrush( new Rectangle(r.Left+block_span,r.Top+block_span+(block_hieght+block_span)*i,block_width,block_hieght),
     pens[i].Color,
     Color.Snow,
     LinearGradientMode.BackwardDiagonal),
     r.Left+block_span,
     r.Top+block_span+(block_hieght+block_span)*i,
     block_width,
     block_hieght);
    g.DrawString(Convert.ToString((valus[i]/value_sum*100))+"% "+texts[i],base.font,Brushes.Black,r.Right+2,r.Top+block_span+(block_hieght+block_span)*i);
   }
   //画出标志方块
   return base.map_canvas;
  }
}
}

///////////////////////以上为DLL文件里的内容;

DLL的使用方法,例:
Primap       primap=new Primap();
DataSource source=new DataSource();
source.pri_texts  =new string[]{"a","b"};
source.pri_values=new float[](100,500);

primap.datasource=source;
primap.CreateMap().Sava(Respone.OutStream,ImageFormat.jpeg);//这是在WEB上的用法.



--  作者:cwzb
--  发布时间:6/14/2004 1:19:00 PM

--  
刚才给出了DLL项目文件的代码。大家感兴趣的,完全可以修改一下,改得自己认为更好的。
也可以直接来我这里要DLL文件。或是自己把代码COPY下来。编译一下。呵呵。
下面我给出调用它的WEBSERVICES文件:
1AnalyseServices.asmx

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;

using System.Drawing.Imaging;
using System.Text;

using OrdermanSystem.CommonLibrary.Data;
using OrdermanSystem.BusinessLogic.SalesManage;
using Biisomsoft.Report;

namespace OrdermanSystem.WEBUI.SalesManage.SalesAnalyse
{

 public enum EMapType
 {
  linmap,
  hismap,
  primap,
 }

 public class AnalyseServices : System.Web.Services.WebService
 {  
  private clsSalesManage     _SalesManage=new clsSalesManage();
  private EMapType           _MapType;
  private ESalesAnalyseType  _AnalyseType;
  private DataSet            _DataSet;
  private DataSource         _DataSource;

  private Linmap             _linmap;
  private Hismap             _hismap;
  private Primap             _primap;

  public AnalyseServices()
  {
   //CODEGEN: 该调用是 ASP.NET Web 服务设计器所必需的
   InitializeComponent();
  }

  #region 组件设计器生成的代码
  
  //Web 服务设计器所必需的
  private IContainer components = null;
    
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {
  }

  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if(disposing && components != null)
   {
    components.Dispose();
   }
   base.Dispose(disposing);  
  }
  
  #endregion

  #region -- 图片创建函数 --
  
  [WebMethod]
  public void LinMap(short itype,int itemid,DateTime fromday,DateTime today,int dayspan)
  {
   this._MapType=EMapType.linmap;

   _linmap=new Linmap();
   _linmap.dataSource=this.GetDataSource(itype,dayspan,fromday,today,itemid);
   
   _linmap.CreateMap().Save(HttpContext.Current.Response.OutputStream,ImageFormat.Jpeg);
  }

     [WebMethod]
  public void PriMap(short itype,int itemid,DateTime fromday,DateTime today,int dayspan)
  {   
   this._MapType=EMapType.primap;
       
   _primap=new Primap();
   _primap.dataSource=this.GetDataSource(itype,dayspan,fromday,today,itemid);

   _primap.CreateMap().Save(HttpContext.Current.Response.OutputStream,ImageFormat.Jpeg);
  }

  [WebMethod]
  public void HisMap(short itype,int itemid,DateTime fromday,DateTime today,int dayspan)
  {   
   this._MapType=EMapType.hismap;
       
   _hismap=new Hismap();
   _hismap.dataSource=this.GetDataSource(itype,dayspan,fromday,today,itemid);
   
   _hismap.CreateMap().Save(HttpContext.Current.Response.OutputStream,ImageFormat.Jpeg);
  }

  //////////////////////////////////1.按查找数据获得数据源
  #endregion

  private DataSource GetDataSource(short itype,int dayspan,DateTime fromday,DateTime today,int itemid)
  {
   _AnalyseType=(ESalesAnalyseType)itype;
   _DataSet    =new DataSet();

   switch(_AnalyseType)
   {
       case ESalesAnalyseType.ItemConsumes:
     _SalesManage.CosumeTimeAnalyse(itemid,dayspan,fromday,today,ref _DataSet);
     break;
     
    case ESalesAnalyseType.ItemSusiness:
     _SalesManage.CosumeMoneyAnalyse(itemid,dayspan,fromday,today,ref _DataSet);
     break;

    case ESalesAnalyseType.PhaseSusiness:
     _SalesManage.AllCosumeMoneyAnalyse(dayspan,fromday,today,ref _DataSet);
     break;

    case ESalesAnalyseType.RepastCount:
     _SalesManage.AllCosumePersonAnalyse(dayspan,fromday,today,ref _DataSet);
     break;

    case ESalesAnalyseType.RepastSusiness:
     break;
   }

   return this.BuilderSource(_DataSet.Tables[0],dayspan,fromday,today,itemid);
  }

  private DataSource BuilderSource(DataTable table,int dayspan,DateTime fromday,DateTime today,int itemid)
  {
   _DataSource=new DataSource();

   string[] texts,titles;
   float[]  values;
   float[,] lin_values;

   switch(_MapType)
   {
    case EMapType.hismap:
     this.BuilderData_His(table,"","",out texts,out values);
     _DataSource.his_texts =texts;
     _DataSource.his_values=values;
     break;

    case EMapType.linmap:
     this.BuliderData_Lin(table,"","",out texts,out lin_values,out titles);
     _DataSource.lin_texts =texts;
     _DataSource.lin_titles=titles;
     _DataSource.lin_values=lin_values;
     break;

    case EMapType.primap:
     this.BuilderData_Pri(table,"","",out texts,out values);
     _DataSource.pri_texts=texts;
     _DataSource.pri_values=values;
     break;
   }
   
   return _DataSource;

  }  
  
  //  
  //        日,周,月,季,年
  //         1,  2 , 3,  4, 5

  ///////////////////////////////////////////////////////////2.结束
  ///////////////////////////////////////////3.按分析图类型获得数据源
  
  private void BuilderData_His(DataTable table,string textfield,string valuefield,out string[] texts,out float[] values)
  {
   texts =new string[table.Rows.Count];
   values=new float[table.Rows.Count];

   for(int i=0;i<table.Rows.Count;i++)
   {
    texts[i] =table.Rows[i][0].ToString();
    values[i]=Convert.ToSingle(table.Rows[i][1]);    
   }
  }
  private void BuilderData_Pri(DataTable table,string textfield,string valuefield,out string[] texts,out float[] values)
  {
   texts =new string[]{"午餐情况","晚餐情况","夜宵情况","早餐情况"};
   values=new float[texts.Length];
      
   int col_count=table.Columns.Count;

   DataColumn col1=new DataColumn("col1",Type.GetType("System.Decimal"),"Sum("+table.Columns[2].ColumnName+")");
   DataColumn col2=new DataColumn("col2",Type.GetType("System.Decimal"),"Sum("+table.Columns[3].ColumnName+")");
   DataColumn col3=new DataColumn("col3",Type.GetType("System.Decimal"),"Sum("+table.Columns[4].ColumnName+")");
   DataColumn col4=new DataColumn("col4",Type.GetType("System.Decimal"),"Sum("+table.Columns[5].ColumnName+")");

   table.Columns.Add(col1);
   table.Columns.Add(col2);
   table.Columns.Add(col3);
   table.Columns.Add(col4);

   for(int i=0;i<texts.Length;i++)
   {
    values[i]=Convert.ToSingle(table.Rows[0][col_count+i]);
   }  

  }
  private void BuliderData_Lin(DataTable table,string textfield,string valuefield,out string[] texts,out float[,] values,out string[] titles)
  {
   texts =new string[table.Rows.Count];
   values=new float[5,table.Rows.Count];
   titles=new string[]{"总额情况","午餐情况","晚餐情况","夜宵情况","早餐情况"};

   for(int i=0;i<table.Rows.Count;i++)
   {
    texts[i]=table.Rows[i][0].ToString();
    values[4,i]=Convert.ToSingle(table.Rows[i][1]);
    values[0,i]=Convert.ToSingle(table.Rows[i][2]);
    values[1,i]=Convert.ToSingle(table.Rows[i][3]);
    values[2,i]=Convert.ToSingle(table.Rows[i][4]);
    values[3,i]=Convert.ToSingle(table.Rows[i][5]);
   }
  }
        
 }
}

//有关ADO。NET的数据源方面。我就不给出了。这个文件作一下参考,大家可以把数据源方面改一下。一般也就可以用。
这个文件里,我用了一个ENUM。


--  作者:cwzb
--  发布时间:6/14/2004 1:23:00 PM

--  
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
现在给出ASP。NET页面。主要有JS来参数传给WEBSERVICES,所以这个将是无刷新的一个系统:
1.WebForm1.aspx
2.WebForm1.aspx.cs//主要作为:初始化一些数据

1.WebForm1.aspx
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="OrdermanSystem.WEBUI.SalesManage.SalesAnalyse.business.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
 <HEAD>
  <title>阶段营业分析</title>
  <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
  <meta name="CODE_LANGUAGE" Content="C#">
  <meta name="vs_defaultClientScript" content="JavaScript">
  <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
  <link rel="stylesheet" href="../../../_style/main.css" type="text/css">
  <script language="javascript">
  <!--
  function Calendar_Select(e) {
   if (document.getElementById("myCal").style.visibility=="hidden") {
    document.getElementById("myCal").style.visibility="visible";
    //月历根据文本框中的位置定位
    document.getElementById("myCal").style.top=e.previousSibling.offsetTop+20;
    document.getElementById("myCal").style.left=e.previousSibling.offsetLeft-120;
    document.getElementById("myCal").className=e.previousSibling.id;
   }
   else {
    document.getElementById("myCal").style.visibility="hidden";
   }
  }
  -->
  </script>
  <script language="javascript" type="text/javascript">
  function bms_PhaseSelect(obj)
  {
  
      //a.selectedIndex;//0,1,2,3,4
      if(obj.selectedIndex<2)
      {
          document.getElementById("phase1").style.display  ="inline";
    document.getElementById("phase2").style.display  ="none";
          return;
      }
      //对周或日进行计算
      
      if(obj.selectedIndex<4)
      {
          document.getElementById("phase1").style.display  ="none";
    document.getElementById("phase2").style.display  ="inline";
    document.getElementById("phase3_1").style.display="inline";
    document.getElementById("phase3_2").style.display="inline";
          return;
      }
      //对月跟季进行计算
      
      document.getElementById("phase1").style.display  ="none";
      document.getElementById("phase2").style.display  ="inline";
      document.getElementById("phase3_1").style.display="none";
      document.getElementById("phase3_2").style.display="none";
      return;
      //对年进行计算
  }
  </script>
  <script language="javascript" type="text/javascript">
  function bms_chick(e)
  {
      var fromtime;
      var totime;
      var item_id='1';
      if(item_id=="")
      {
          alert("提示:请先选择左边项目!");
          return;
      }
      var dayspan=document.getElementById("ddlPhase").item(document.getElementById("ddlPhase").selectedIndex).value;
      switch(dayspan)
      {
          case "1":
          case "2":
              fromtime=document.getElementById("tbFormtime").getAttribute("value");
              totime  =document.getElementById("tbToTime").getAttribute("value");
              
              if(fromtime.split('-')[0]!=totime.split('-')[0])
              {
                  alert("提示:以“日”或“周”为段的分析,不能跨年!!");
                  return;
              }
              if(dayspan==1&&Math.abs(Number(fromtime.split('-')[1])-Number(totime.split('-')[1]))>1)
              {
                  alert("提示:以“日”为段的分析,不能跨月,并只能在16天以内!");
                  return;
              }
              if(dayspan==2&&Math.abs(Number(fromtime.split('-')[1])-Number(totime.split('-')[1]))>3)
              {
                  alert("提示:以“周”为段的分析,不能跨月,并只能在16周以内!");
                  return;
              }
              
              break;  
          case "3":
          case "4":              
          case "5":
              fromtime =document.getElementById("ddlfromYear").item(document.getElementById("ddlfromYear").selectedIndex).value+"-";
              fromtime+=document.getElementById("ddlfromMonth").item(document.getElementById("ddlfromMonth").selectedIndex).value+"-1";
              totime   =document.getElementById("ddltoYear").item(document.getElementById("ddltoYear").selectedIndex).value+"-";
              totime  +=document.getElementById("ddltoMonth").item(document.getElementById("ddltoMonth").selectedIndex).value+"-1";
              
              if(dayspan==3&&Math.abs(Number(fromtime.split('-')[0])-Number(totime.split('-')[0]))>2)
              {
                  alert("提示:以“月”为段的分析,不能跨月,并只能在16月以内!");
                  return;
              }
              if(dayspan==3&&Math.abs(Number(fromtime.split('-')[0])-Number(totime.split('-')[0]))>4)
              {
                  alert("提示:以“季”为段的分析,不能跨月,并只能在4年以内!");
                  return;
              }
              
              break;
      }//确定好时间
      
      switch(e)
      {
          case "0":
              document.getElementById("maphome").src="../AnalyseServices.asmx/LinMap?itype=3&itemid="+item_id+"&fromday="+fromtime+"&today="+totime+"&dayspan="+dayspan+"&maptype=1";
              break;
         
          case "1":              
              document.getElementById("maphome").src="../AnalyseServices.asmx/HisMap?itype=3&itemid="+item_id+"&fromday="+fromtime+"&today="+totime+"&dayspan="+dayspan+"&maptype=1";
              break;
          
          case "2":
              document.getElementById("maphome").src="../AnalyseServices.asmx/PriMap?itype=3&itemid="+item_id+"&fromday="+fromtime+"&today="+totime+"&dayspan="+dayspan+"&maptype=1";
              break;
      }      
  }
  </script>
  <style type="text/css">.bmc_show { DISPLAY: inline }
 .bmc_hidde { DISPLAY: none }
  </style>
 </HEAD>
 <body MS_POSITIONING="FlowLayout" bottomMargin="0" leftMargin="0" topMargin="0" rightMargin="0">
  <form id="Form1" method="post" runat="server">
   <table height="83" cellSpacing="0" cellPadding="0" width="100%" background="../../../_images/toolback_a.png"
    border="0">
    <tr height="53">
     <td>分析项目:<asp:textbox id="tbName" runat="server" CssClass="textred" Width="100" ReadOnly="True">阶段营业客分析</asp:textbox>&nbsp;&nbsp;&nbsp;&nbsp;
      分析日期:以<asp:dropdownlist id="ddlPhase" runat="server" onchange="bms_PhaseSelect(this);">
       <asp:ListItem Value="1">日</asp:ListItem>
       <asp:ListItem Value="2" Selected="True">周</asp:ListItem>
       <asp:ListItem Value="3">月</asp:ListItem>
       <asp:ListItem Value="4">季</asp:ListItem>
       <asp:ListItem Value="5">年</asp:ListItem>
      </asp:dropdownlist>为段 &nbsp;<span class="bmc_show" id="phase1">从<asp:textbox id="tbFormtime" runat="server" CssClass="textred" Width="80" ReadOnly="True"></asp:textbox><input onclick="javascript:return Calendar_Select(this)" type="button" value="v">
       到<asp:textbox id="tbToTime" runat="server" CssClass="textred" Width="80" ReadOnly="True"></asp:textbox><input onclick="javascript:return Calendar_Select(this)" type="button" value="v">
      </span><span class="bmc_hidde" id="phase2">从
       <asp:dropdownlist id="ddlfromYear" Runat="server"></asp:dropdownlist>年 <span id="phase3_1">
        <asp:dropdownlist id="ddlfromMonth" Runat="server">
         <asp:ListItem Value="1">1</asp:ListItem>
         <asp:ListItem Value="2">2</asp:ListItem>
         <asp:ListItem Value="3">3</asp:ListItem>
         <asp:ListItem Value="4">4</asp:ListItem>
         <asp:ListItem Value="5">5</asp:ListItem>
         <asp:ListItem Value="6">6</asp:ListItem>
         <asp:ListItem Value="7">7</asp:ListItem>
         <asp:ListItem Value="8">8</asp:ListItem>
         <asp:ListItem Value="9">9</asp:ListItem>
         <asp:ListItem Value="10">10</asp:ListItem>
         <asp:ListItem Value="11">11</asp:ListItem>
         <asp:ListItem Value="12">12</asp:ListItem>
        </asp:dropdownlist>月 </span>到
       <asp:dropdownlist id="ddltoYear" Runat="server"></asp:dropdownlist>年 <span id="phase3_2">
        <asp:dropdownlist id="ddltoMonth" Runat="server">
         <asp:ListItem Value="1">1</asp:ListItem>
         <asp:ListItem Value="2">2</asp:ListItem>
         <asp:ListItem Value="3">3</asp:ListItem>
         <asp:ListItem Value="4">4</asp:ListItem>
         <asp:ListItem Value="5">5</asp:ListItem>
         <asp:ListItem Value="6">6</asp:ListItem>
         <asp:ListItem Value="7">7</asp:ListItem>
         <asp:ListItem Value="8">8</asp:ListItem>
         <asp:ListItem Value="9">9</asp:ListItem>
         <asp:ListItem Value="10">10</asp:ListItem>
         <asp:ListItem Value="11">11</asp:ListItem>
         <asp:ListItem Value="12">12</asp:ListItem>
        </asp:dropdownlist>月 </span></span>
     </td>
    </tr>
    <tr height="30">
     <td align="right"><INPUT type="button" value="阶段情况总览" onclick="bms_chick('1');"><INPUT type="button" value="餐次情况比例图" onclick="bms_chick('2');"><INPUT type="button" value="餐次情况走势图" onclick="bms_chick('0');">
     </td>
    </tr>
   </table>
   <iframe id="myCal" style="BORDER-RIGHT: 0px solid; BORDER-TOP: 0px solid; Z-INDEX: 100; LEFT: 0px; VISIBILITY: hidden; BORDER-LEFT: 0px solid; WIDTH: 220px; BORDER-BOTTOM: 0px solid; POSITION: absolute; TOP: 200px; HEIGHT: 145px"
    src="../../../_script/HtmCom/CALENDAR.htm" frameborder="no" scrolling="no"></iframe>
   <IFRAME id="maphome" frameBorder="no" width="100%" scrolling="no" height="450"></IFRAME>
  </form>
 </body>
</HTML>


2.WebForm1.aspx.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;

using OrdermanSystem.BusinessLogic.SalesManage;

namespace OrdermanSystem.WEBUI.SalesManage.SalesAnalyse.business
{
 /// <summary>
 /// WebForm2 的摘要说明。
 /// </summary>
 public class WebForm2 : System.Web.UI.Page
 {  
  protected System.Web.UI.WebControls.TextBox tbName;
  protected System.Web.UI.WebControls.TextBox tbFormtime;
  protected System.Web.UI.WebControls.TextBox tbToTime;
  protected System.Web.UI.WebControls.DropDownList ddlPhase;

  //
  protected clsSalesManage _SalesManage=new clsSalesManage();
  protected System.Web.UI.WebControls.DropDownList ddlfromYear;
  protected System.Web.UI.WebControls.DropDownList ddlfromMonth;
  protected System.Web.UI.WebControls.DropDownList ddltoYear;
  protected System.Web.UI.WebControls.DropDownList ddltoMonth;
  protected DataSet       _DataSet;
 
  private void Page_Load(object sender, System.EventArgs e)
  {
   if(!IsPostBack)
   {
    this.LoadThisPage();   
   }
  }

  #region Web 窗体设计器生成的代码
  override protected void OnInit(EventArgs e)
  {
   //
   // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
   //
   InitializeComponent();
   base.OnInit(e);
  }
  
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>
  private void InitializeComponent()
  {    
   this.Load += new System.EventHandler(this.Page_Load);

  }
  #endregion

  private void LoadThisPage()
  {
   this.BuilderDLLYEAR();
   this.tbFormtime.Text=DateTime.Now.Date.AddMonths(-1).ToString().TrimEnd("0:00:00".ToCharArray());
   this.tbToTime.Text  =DateTime.Now.Date.ToString().TrimEnd("0:00:00".ToCharArray());
   this.ddltoYear.SelectedValue =DateTime.Now.Year.ToString();
   this.ddltoMonth.SelectedValue=DateTime.Now.Month.ToString();  
  }
  
  private void BuilderDLLYEAR()
  {
   for(int i=2000;i<2050;i++)
   {
    ddlfromYear.Items.Add(new ListItem(i.ToString(),i.ToString()));
    ddltoYear.Items.Add(new ListItem(i.ToString(),i.ToString()));
   }
  }    
 }
}

//到这里也就完成了。


--  作者:hsb0307
--  发布时间:6/15/2004 9:15:00 AM

--  
能不能直接给整个项目的源文件,我们学习起来方便一点。
--  作者:cwzb
--  发布时间:6/16/2004 10:52:00 PM

--  
当然可以:)
可是有地方放吗?这里可不可以直接上传?
//请把建议写在回复里.

顺便转告一下大家,关于字不能斜的问题,我已经解决了.....呵呵...可以说它现在已经进入实用阶段.


///////////////////////////////////////////////////////
上次所讲的字不能倾斜的问题,我已经纠正。。可看下面的图片:


此主题相关图片如下:
按此在新窗口浏览图片

下面我入上项目文件,以供大家下学试玩。。。由于工作较忙,一直都没有优化过。大家可以好好的优化一下。


[此贴子已经被作者于2004-6-17 14:40:41编辑过]

--  作者:rain-yy
--  发布时间:4/27/2005 11:05:00 AM

--  
谢谢楼主,我做毕设正好要用到这个。不过我是刚开始学,有什么不会的还要问。:)
--  作者:锋锋
--  发布时间:5/15/2005 11:32:00 PM

--  
so good!
--  作者:z_shunquan
--  发布时间:5/28/2005 10:05:00 AM

--  
好好看看下。谢谢
--  作者:billy_king1982
--  发布时间:10/20/2005 8:54:00 PM

--  
看来不错啊!!
看看先!!
谢楼主啊!!
--  作者:microsoft
--  发布时间:10/22/2005 1:58:00 AM

--  
看起来。不是那么容易看懂!!!
不过还是UP下!
--  作者:xuetu211
--  发布时间:11/6/2005 11:11:00 PM

--  
好贴,顶一下!
不过代码有些地方研究的还不是很明白
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
187.500ms