在Asp.net页面中实现数据饼图


ASP.NET之所以能够在客户端浏览器中形成各种数据图片,是因为在ASP.NET中提供了绘图功能,具体的作法是先在服务器端创建一个Bitmap实例,然后利用ASP.NET中提供的绘图功能,按照要生成的图片的模样,进行绘制,最后把绘制好的实例以数据流的方式传送到客户端的浏览器上,并形成图片显示出来。本文要介绍的在ASP.NET页面中实现数据饼图采用的基本也是这种方法。饼图有时称为"Pie"图,本文要实现的数据饼图模样具体如图01所示:
piePic.JPG
图01:在ASP.NET页面中产生的数据饼图

   一.本文程序设计和运行的软件环境:

  (1).微软公司视窗2000服务器版。

  (2).Visual Studio .Net正式版,.Net FrameWork SDK版本号3705。

  (3).MDAC 2.6(Microsoft Data Acess Component)以上版本。

   二.数据字典:
为了方便起见,本文选择的数据库类型为本地数据库--Access 2000,如果你使用的是其他数据库类型,只需对下面介绍的程序中的关于数据库连接的代码进行相应的修改就可以了。Access数据库名称为"db2.mdb",在此数据库中只定义了一张数据表"MonthSale",此表的结构如表01所示:

字段名称类型 说明
ID自动编号 主键 ,递增
YF 数字销售月份
SL数字 销量
         表01:MonthSale数据表的结构

  在定义完"db2.mdb"数据库中的"MonthSale"数据表后,在MonthSale数据表中按照表02所示添加记录:

ID YF SL
1 1 12
2 2 5
337
4 4 20
5 5 16
6 6 10
7 7 19
8 8 8
997
10 10 13
11 11 11
12 12 15
      表02:MonthSale数据表中的记录情况

  在MonthSale数据表中添加完这12条记录后,保存"db2.mdb"数据库到C盘的根目录中。

下面就要解决根据从数据库中读取的数据绘制Pie图的方法。

  (1).绘制数据Pie图的实现方法:

  图01所示的Pie图看似是由一个圆形按照从数据库中得到数据值的大小分割而成的,其实在具体实现时并非如此,图01所示的Pie图其实由许多根据从数据库中数值大小,绘制相应的扇型,并由这些扇型组合而成的

  (2).简介ASP.NET页面中绘制扇型要使用到的类及其方法:

  在本文和前文中,在ASP.NET页面中实现绘图功能主要使用的是Graphics类,Graphics类被封装在命名空间"System.Drawing"中。Graphics类中定义了很多方法和属性,这些方法和属性都与绘图有关,Graphics类中的常用成员具体可参阅表01和表02,表01是Graphics类中的常用方法及其说明,表02是Graphics类中常用属性及其说明:

方法 说明
Clear清除整个绘图面并以指定背景色填充。
Dispose释放由此Graphics对象使用的所有资源。
DrawArc 绘制一段弧线,它表示由一对坐标、宽度和高度指定的椭圆部分。
DrawEllipse绘制一个由边框定义的椭圆。
DrawIcon在指定坐标处绘制由指定的Icon对象表示的图像。
DrawIconUnstretched 绘制指定的Icon对象表示的图像,而不缩放该图像。
DrawImage 在指定位置并且按原始大小绘制指定的Image对象。
DrawImageUnscaled在坐标对所指定的位置并且按其原始大小绘制指定的Image对象。
DrawLine绘制一条连接由坐标对指定的两个点的线条。
DrawLines 绘制一系列连接一组Point结构的线段。
DrawPie 绘制一个扇形,该扇形由一个坐标对、宽度和高度以及两条射线所指定的椭圆定义。
DrawPolygon 绘制由一组Point结构定义的多边形。
DrawRectangle绘制由坐标对、宽度和高度指定的矩形。
DrawRectangles 绘制一系列由Rectangle结构指定的矩形。
DrawString 在指定位置并且用指定的Brush和Font对象绘制指定的文本字符串。
FillClosedCurve填充由Point结构数组定义的闭合基数样条曲线的内部。
FillEllipse 填充边框所定义的椭圆的内部,该边框由一对坐标、一个宽度和一个高度指定。
FillPie填充由一对坐标、一个宽度、一个高度以及两条射线指定的椭圆所定义的扇形区的内部。
FillPolygon
填充Point结构指定的点数组所定义的多边形的内部。
FillRectangle填充由一对坐标、一个宽度和一个高度指定的矩形的内部。
FillRectangles填充由Rectangle结构指定的一系列矩形的内部。
FillRegion填充Region 对象的内部。
Flush 强制执行所有挂起的图形操作并立即返回而不等待操作完成。
FromHdc 从设备上下文的指定句柄创建新的Graphics对象。
FromHwnd 从窗口的指定句柄创建新的Graphics对象。
FromImage 从指定的Image对象创建新Graphics对象。
GetHdc获取与此Graphics对象关联的设备上下文的句柄。
ReleaseHdc释放通过以前对此Graphics对象GetHdc方法的调用获得的设备上下文句柄。
ResetClip将此Graphics对象的剪辑区域重置为无限区域。
ResetTransform 将此Graphics对象的全局变换矩阵重置为单位矩阵。

           表01:Graphics类中的常用方法及其说明

  在本文中使用最多,也是最重要的方法就是:FillPie和DrawPie方法。这二个方法的具体使用方法,在下文中又详细介绍。

属性说明
Clip获取或设置Region对象,该对象限定此Graphics对象的绘图区域。
ClipBounds 获取RectangleF结构,该结构限定此Graphics对象的剪辑区域。
DpiX 获取此Graphics对象的水平分辨率。
DpiY获取此Graphics对象的垂直分辨率。
PageScale 获取或设置此Graphics对象的全局单位和页单位之间的比例。
PageUnit 获取或设置用于此Graphics对象中的页坐标的度量单位。
PixelOffsetMode 获取或设置一个值,该值指定在呈现此Graphics对象的过程中像素如何偏移。
RenderingOrigin 为抵色处理和阴影画笔获取或设置此Graphics对象的呈现原点。
SmoothingMode 获取或设置此Graphics对象的呈现质量。
TextRenderingHint 获取或设置与此Graphics对象关联的文本的呈现模式。
Transform 获取或设置此Graphics对象的全局变换。
VisibleClipBounds 获取或设置此Graphics对象的可见剪辑区域的边框。
             表02:Graphics类中的常用属性及其说明

  (3).利用FillPie和DrawPie方法绘制扇型的具体方法:

  DrawPie方法功能是绘制一个扇型,下面是 DrawPie方法的一种调用语法,此语法也是本文中主要的调用方式,具体如下:

  public void DrawPie ( Pen , float , float , float , float , float , float ) ;

  此种DrawPie调用方法是由七个参数组成,这七个参数的具体说明如下:

  第一个参数:定义绘制扇型的画笔类型;

  第二和第三个参数:定义扇型的坐标;

  第四和第五个参数:定义组成扇型的二个射线的长度;

  第六和第七个参数:定义扇型的开始角度和扇型旋转的角度大小。其中把X坐标的正方向定为0度角,计算扇型的开始角度的按照顺时针方向旋转,最先到达的扇型的那条射线和0度角之间的夹角。

  下列代码就是在ASP.NET页面中绘制一个扇型:

Bitmap bm = new Bitmap ( 600 , 300 ) ;
//创建一个长度为600,宽带为300的Bitmap实例
Graphics g ;
g = Graphics.FromImage ( bm ) ;
//由此Bitmap实例创建Graphic实例
g . Clear ( Color . Snow ) ;
g.DrawPie ( Pens.Red , 50 , 50 , 150 , 150 , 0 , 30 ) ;
  四.ASP.NET页面中实现数据Pie图实现步骤

  在实现数据Pie图之前,首先要确保在C盘的根目录存在"db.mdb"数据库,并且此数据库已经设定完毕,并且存在《在ASP.NET页面中实现数据棒图》一文中的数据。下面是ASP.NET实现数据Pie图的具体步骤,开发工具使用的是Visual Studio .Net,采用的是C#语言。

  1. 启动Visual Studio .Net。

  2. 选择菜单【文件】|【新建】|【项目】后,弹出【新建项目】对话框。

  3. 将【项目类型】设置为【Visual C#项目】。

  4. 将【模板】设置为【ASP.NET Web 应用程序】。

  5. 在【位置】的文本框中输入"http://localhost/Pie"。然后单击【确定】按钮,这样在Visual Studio .Net就会在当前项目文件所在目录中建立一个名称为"Pie"文件夹,里面存放是此项目的项目文件,项目中的其他文件存放的位置是计算机Internet信息服务的默认的Web站点所在的目录中新建的一个名称为"WebPieDemo"的文件夹中
 6. 把Visual Studio .Net的当前窗口切换到WebForm的代码编辑窗口,即:WebForm1.aspx.cs文件的编辑窗口。

  7. 在WebForm1.aspx.cs文件首部,用下列代码替换WebForm1.aspx.cs中导入命名空间的代码:
1 None.gif // 下面程序中使用的ImageFormat类所在的命名空间
2 None.gif using  System . Drawing . Imaging ;
3 None.gif // 下面程序中使用到关于数据库方面的类所在的命名空间
4 None.gif using  System . Data . OleDb ;
8. WebForm1.aspx.cs文件中的Page_Load事件处理代码中添加下列代码,下列代码的作用是打开数据库,读取数据,并以此数据形成数据Pie图:
  1 None.gif private   void  Page_Load( object  sender, System.EventArgs e)
  2 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {
  3InBlock.gif            // 在此处放置用户代码以初始化页面
  4InBlock.gif            string sRouter = "c:\\db2.mdb" ;
  5InBlock.gif
  6InBlock.gif            //获得当前Access数据库在服务器端的绝对路径
  7InBlock.gif            string strCon = " Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " + sRouter ;
  8InBlock.gif
  9InBlock.gif            //创建一个数据库连接
 10InBlock.gif            OleDbConnection myConn = new OleDbConnection ( strCon ) ;
 11InBlock.gif            string strCom = " SELECT YF ,SL FROM MonthSale ORDER BY YF" ;
 12InBlock.gif            myConn.Open ( ) ;
 13InBlock.gif            OleDbCommand myCommand = new OleDbCommand ( strCom , myConn ) ;
 14InBlock.gif            OleDbDataReader myOleDbDataReader = myCommand.ExecuteReader ( ) ;
 15InBlock.gif            //创建OleDbDataReader实例,并以此实例来获取数据库中各条记录数据
 16InBlock.gif
 17InBlock.gif            int [ ] iXiaoSH = new int [ 12 ] ;
 18InBlock.gif            //定义一个数组,用以存放从数据库中读取的销售数据
 19InBlock.gif
 20InBlock.gif            string [ ] sMoth = new string [ 12 ] ;
 21InBlock.gif            //定义一个数组,用以存放从数据库中读取的销售月份
 22InBlock.gif
 23InBlock.gif            int iIndex = 0 ;
 24InBlock.gif            while ( myOleDbDataReader.Read ( ) ) 
 25ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 26InBlock.gif                iXiaoSH [ iIndex ] = myOleDbDataReader.GetInt32 ( 1 ) ;
 27InBlock.gif                sMoth [ iIndex ] = myOleDbDataReader.GetInt32 ( 0 ) . ToString() + "" ;
 28InBlock.gif                iIndex++ ;
 29ExpandedSubBlockEnd.gif            }

 30InBlock.gif            //读取Table01数据表中的各条数据,并存放在先前定义的二个数组中
 31InBlock.gif
 32InBlock.gif            myConn . Close ( ) ;
 33InBlock.gif            myOleDbDataReader . Close ( ) ;
 34InBlock.gif 
 35InBlock.gif            Bitmap bm = new Bitmap ( 600 , 300 ) ;
 36InBlock.gif            //创建一个长度为600,宽带为300的Bitmap实例
 37InBlock.gif
 38InBlock.gif            Graphics g ;
 39InBlock.gif            g = Graphics.FromImage ( bm ) ;
 40InBlock.gif            g . Clear ( Color . Snow ) ;
 41InBlock.gif            g . DrawString ( " ××公司××××年度销售情况一览表" , new Font ( "宋体" , 16 ) , Brushes . Black , new Point ( 5 , 5 ) ) ;
 42InBlock.gif            //在绘画图面的指定位置,以指定的字体、指定的颜色绘制指定的字符串。即为图表标题
 43InBlock.gif
 44InBlock.gif            //以下代码是是实现图01中的右上部区域
 45InBlock.gif            //以上是在图01中为下面绘制定位
 46InBlock.gif            Point myRec = new Point ( 515 , 30 ) ;
 47InBlock.gif            Point myDec = new Point ( 540 , 30 ) ;
 48InBlock.gif            Point myTxt = new Point ( 565 , 30 ) ;
 49InBlock.gif            g . DrawString ( "单位:万套" , new Font ( "宋体" , 9 ) , Brushes . Black , new Point ( 515 , 12 ) ) ;
 50InBlock.gif            for ( int i = 0 ; i < sMoth.Length ; i++ ) 
 51ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 52InBlock.gif                g . FillRectangle ( new SolidBrush ( GetColor ( i ) ) , myRec . X , myRec . Y , 20 , 10 ) ;
 53InBlock.gif                //填充小方块
 54InBlock.gif
 55InBlock.gif                g . DrawRectangle ( Pens.Black , myRec . X , myRec . Y , 20 , 10 ) ;
 56InBlock.gif                //绘制小方块
 57InBlock.gif
 58InBlock.gif                g . DrawString ( sMoth [ i ] . ToString ( ) , new Font ( "宋体"9 ) , Brushes . Black , myDec ) ;
 59InBlock.gif                //绘制小方块右边的文字
 60InBlock.gif
 61InBlock.gif                g . DrawString ( iXiaoSH[i].ToString (), new Font ( "宋体"9 ) , Brushes . Black , myTxt ) ;
 62InBlock.gif                myRec . Y += 15 ;
 63InBlock.gif                myDec . Y += 15 ;
 64InBlock.gif                myTxt . Y += 15 ;
 65ExpandedSubBlockEnd.gif            }

 66InBlock.gif
 67InBlock.gif            //以下代码是根据从数据库中得到的数值大小,绘制扇型,并以相应色彩填充扇型,//从而构成图01中的Pie图
 68InBlock.gif            int iTatal = 0 ; 
 69InBlock.gif            float fCurrentAngle = 0 ;
 70InBlock.gif            float fStartAngle = 0;
 71InBlock.gif            for ( int i = 0 ; i < iXiaoSH . Length ; i++ )
 72ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 73InBlock.gif                iTatal = iTatal + iXiaoSH [ i ] ;
 74ExpandedSubBlockEnd.gif            }

 75InBlock.gif            for ( int i = 0 ; i < iXiaoSH . Length ; i++ )
 76ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 77InBlock.gif                //以下代码是获得要绘制扇型的开始角度
 78InBlock.gif                if ( i == iXiaoSH . Length - 1 )
 79ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
 80InBlock.gif                    fCurrentAngle = 360- fStartAngle ;
 81ExpandedSubBlockEnd.gif                }

 82InBlock.gif                else
 83ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
 84InBlock.gif                    int iTemp = iXiaoSH [ i ] ;
 85InBlock.gif                    fCurrentAngle = ( iTemp * 360 ) / iTatal ;
 86ExpandedSubBlockEnd.gif                }

 87InBlock.gif                //根据参数绘制扇型
 88InBlock.gif
 89InBlock.gif                g.DrawPie ( Pens.Black , 100 , 40 , 250 , 250 , fStartAngle , fCurrentAngle ) ;
 90InBlock.gif                //以指定色彩填充绘制的扇型
 91InBlock.gif
 92InBlock.gif                g.FillPie ( new SolidBrush ( GetColor ( i ) ) , 100 , 40 , 250 , 250 , fStartAngle , fCurrentAngle ) ;
 93InBlock.gif                fStartAngle += fCurrentAngle ;
 94ExpandedSubBlockEnd.gif            }

 95InBlock.gif
 96InBlock.gif            //画出图片的边框
 97InBlock.gif            Pen p = new Pen ( Color.Black , 2 ) ;
 98InBlock.gif            g . DrawRectangle ( p , 1 , 1 , 598 , 298 ) ;
 99InBlock.gif
100InBlock.gif            //向客户端输出数据流,并以此数据流形成Jpeg图片
101InBlock.gif            bm.Save ( Response . OutputStream , ImageFormat . Jpeg ) ;
102ExpandedBlockEnd.gif        }

9. WebForm1.aspx.cs文件中的InitializeComponent过程之后,添加下列代码,下列代码的作用是定义一个名称为GetColor函数,此函数的功能根据索引号得到相应的系统颜色:
 1 ExpandedBlockStart.gif ContractedBlock.gif /**/ /// <summary>
 2InBlock.gif        /// 获取颜色
 3InBlock.gif        /// </summary>
 4InBlock.gif        /// <param name="itemIndex">数组的索引</param>
 5ExpandedBlockEnd.gif        /// <returns></returns>

 6 None.gif          private  Color GetColor (  int  itemIndex ) 
 7 ExpandedBlockStart.gifContractedBlock.gif         dot.gif {
 8InBlock.gif             Color MyColor ;
 9InBlock.gif             int i = itemIndex ;
10InBlock.gif            switch (i) 
11ExpandedSubBlockStart.gifContractedSubBlock.gif             dot.gif{
12InBlock.gif                  case 0 :
13InBlock.gif                   MyColor = Color.Green;
14InBlock.gif                   return MyColor;
15InBlock.gif                  case 1 :
16InBlock.gif                   MyColor = Color.Red;
17InBlock.gif                    return MyColor;
18InBlock.gif                  case 2:
19InBlock.gif                   MyColor = Color.Yellow;
20InBlock.gif                   return MyColor;
21InBlock.gif                  case 3 :
22InBlock.gif                   MyColor = Color.Blue;
23InBlock.gif                   return MyColor;
24InBlock.gif                  case 4 :
25InBlock.gif                   MyColor = Color.Orange;
26InBlock.gif                   return MyColor;
27InBlock.gif                 case 5 :
28InBlock.gif                   MyColor = Color.Aqua;
29InBlock.gif                   return MyColor;
30InBlock.gif                  case 6:
31InBlock.gif                   MyColor = Color.SkyBlue;
32InBlock.gif                   return MyColor;
33InBlock.gif                  case 7:
34InBlock.gif                   MyColor = Color.DeepPink;
35InBlock.gif                   return MyColor;
36InBlock.gif                  case 8:
37InBlock.gif                   MyColor = Color.Azure;
38InBlock.gif                   return MyColor;
39InBlock.gif                  case 9:
40InBlock.gif                   MyColor = Color.Brown;
41InBlock.gif                   return MyColor;
42InBlock.gif                  case 10:
43InBlock.gif                   MyColor = Color.Pink;
44InBlock.gif                   return MyColor;
45InBlock.gif                  case 11:
46InBlock.gif                   MyColor = Color.BurlyWood;
47InBlock.gif                   return MyColor;
48InBlock.gif                  case 12:
49InBlock.gif                   MyColor = Color.Chartreuse;
50InBlock.gif                   return MyColor;
51InBlock.gif                  default:
52InBlock.gif                   MyColor = Color.Pink;
53InBlock.gif                   return MyColor;
54ExpandedSubBlockEnd.gif            }

55ExpandedBlockEnd.gif        }

至此,在上述步骤都正确执行后,在ASP.NET页面中实现数据Pie图的全部工作就完成了。此时单击快捷键F5,就可以得到如图01所示的数据Pie图了。

   五.总结:

  由于ASP.NET提供了丰富的绘图功能,所以结合这二篇文章的介绍,我想再实现其他的数据图表,应该也不算很困难。

完整的例子代码:
  1 None.gif using  System;
  2 None.gif using  System.Collections;
  3 None.gif using  System.ComponentModel;
  4 None.gif using  System.Data;
  5 None.gif using  System.Drawing;
  6 None.gif using  System.Web;
  7 None.gif using  System.Web.SessionState;
  8 None.gif using  System.Web.UI;
  9 None.gif using  System.Web.UI.WebControls;
 10 None.gif using  System.Web.UI.HtmlControls;
 11 None.gif // 下面程序中使用的ImageFormat类所在的命名空间
 12 None.gif using  System . Drawing . Imaging ;
 13 None.gif // 下面程序中使用到关于数据库方面的类所在的命名空间
 14 None.gif using  System . Data . OleDb ;
 15 None.gif
 16 None.gif
 17 None.gif namespace  WebPieDemo
 18 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 19ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// <summary>
 20InBlock.gif    /// WebForm1 的摘要说明。
 21ExpandedSubBlockEnd.gif    /// </summary>

 22InBlock.gif    public class WebForm1 : System.Web.UI.Page
 23ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 24InBlock.gif        private void Page_Load(object sender, System.EventArgs e)
 25ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
 26InBlock.gif            // 在此处放置用户代码以初始化页面
 27InBlock.gif            string sRouter = "c:\\db2.mdb" ;
 28InBlock.gif
 29InBlock.gif            //获得当前Access数据库在服务器端的绝对路径
 30InBlock.gif            string strCon = " Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " + sRouter ;
 31InBlock.gif
 32InBlock.gif            //创建一个数据库连接
 33InBlock.gif            OleDbConnection myConn = new OleDbConnection ( strCon ) ;
 34InBlock.gif            string strCom = " SELECT YF ,SL FROM MonthSale ORDER BY YF" ;
 35InBlock.gif            myConn.Open ( ) ;
 36InBlock.gif            OleDbCommand myCommand = new OleDbCommand ( strCom , myConn ) ;
 37InBlock.gif            OleDbDataReader myOleDbDataReader = myCommand.ExecuteReader ( ) ;
 38InBlock.gif            //创建OleDbDataReader实例,并以此实例来获取数据库中各条记录数据
 39InBlock.gif
 40InBlock.gif            int [ ] iXiaoSH = new int [ 12 ] ;
 41InBlock.gif            //定义一个数组,用以存放从数据库中读取的销售数据
 42InBlock.gif
 43InBlock.gif            string [ ] sMoth = new string [ 12 ] ;
 44InBlock.gif            //定义一个数组,用以存放从数据库中读取的销售月份
 45InBlock.gif
 46InBlock.gif            int iIndex = 0 ;
 47InBlock.gif            while ( myOleDbDataReader.Read ( ) ) 
 48ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 49InBlock.gif                iXiaoSH [ iIndex ] = myOleDbDataReader.GetInt32 ( 1 ) ;
 50InBlock.gif                sMoth [ iIndex ] = myOleDbDataReader.GetInt32 ( 0 ) . ToString() + "" ;
 51InBlock.gif                iIndex++ ;
 52ExpandedSubBlockEnd.gif            }

 53InBlock.gif            //读取Table01数据表中的各条数据,并存放在先前定义的二个数组中
 54InBlock.gif
 55InBlock.gif            myConn . Close ( ) ;
 56InBlock.gif            myOleDbDataReader . Close ( ) ;
 57InBlock.gif 
 58InBlock.gif            Bitmap bm = new Bitmap ( 600 , 300 ) ;
 59InBlock.gif            //创建一个长度为600,宽带为300的Bitmap实例
 60InBlock.gif
 61InBlock.gif            Graphics g ;
 62InBlock.gif            g = Graphics.FromImage ( bm ) ;
 63InBlock.gif            g . Clear ( Color . Snow ) ;
 64InBlock.gif            g . DrawString ( " ××公司××××年度销售情况一览表" , new Font ( "宋体" , 16 ) , Brushes . Black , new Point ( 5 , 5 ) ) ;
 65InBlock.gif            //在绘画图面的指定位置,以指定的字体、指定的颜色绘制指定的字符串。即为图表标题
 66InBlock.gif
 67InBlock.gif            //以下代码是是实现图01中的右上部区域
 68InBlock.gif            //以上是在图01中为下面绘制定位
 69InBlock.gif            Point myRec = new Point ( 515 , 30 ) ;
 70InBlock.gif            Point myDec = new Point ( 540 , 30 ) ;
 71InBlock.gif            Point myTxt = new Point ( 565 , 30 ) ;
 72InBlock.gif            g . DrawString ( "单位:万套" , new Font ( "宋体" , 9 ) , Brushes . Black , new Point ( 515 , 12 ) ) ;
 73InBlock.gif            for ( int i = 0 ; i < sMoth.Length ; i++ ) 
 74ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 75InBlock.gif                g . FillRectangle ( new SolidBrush ( GetColor ( i ) ) , myRec . X , myRec . Y , 20 , 10 ) ;
 76InBlock.gif                //填充小方块
 77InBlock.gif
 78InBlock.gif                g . DrawRectangle ( Pens.Black , myRec . X , myRec . Y , 20 , 10 ) ;
 79InBlock.gif                //绘制小方块
 80InBlock.gif
 81InBlock.gif                g . DrawString ( sMoth [ i ] . ToString ( ) , new Font ( "宋体"9 ) , Brushes . Black , myDec ) ;
 82InBlock.gif                //绘制小方块右边的文字
 83InBlock.gif
 84InBlock.gif                g . DrawString ( iXiaoSH[i].ToString (), new Font ( "宋体"9 ) , Brushes . Black , myTxt ) ;
 85InBlock.gif                myRec . Y += 15 ;
 86InBlock.gif                myDec . Y += 15 ;
 87InBlock.gif                myTxt . Y += 15 ;
 88ExpandedSubBlockEnd.gif            }

 89InBlock.gif
 90InBlock.gif            //以下代码是根据从数据库中得到的数值大小,绘制扇型,并以相应色彩填充扇型,//从而构成图01中的Pie图
 91InBlock.gif            int iTatal = 0 ; 
 92InBlock.gif            float fCurrentAngle = 0 ;
 93InBlock.gif            float fStartAngle = 0;
 94InBlock.gif            for ( int i = 0 ; i < iXiaoSH . Length ; i++ )
 95ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
 96InBlock.gif                iTatal = iTatal + iXiaoSH [ i ] ;
 97ExpandedSubBlockEnd.gif            }

 98InBlock.gif            for ( int i = 0 ; i < iXiaoSH . Length ; i++ )
 99ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
100InBlock.gif                //以下代码是获得要绘制扇型的开始角度
101InBlock.gif                if ( i == iXiaoSH . Length - 1 )
102ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
103InBlock.gif                    fCurrentAngle = 360- fStartAngle ;
104ExpandedSubBlockEnd.gif                }

105InBlock.gif                else
106ExpandedSubBlockStart.gifContractedSubBlock.gif                dot.gif{
107InBlock.gif                    int iTemp = iXiaoSH [ i ] ;
108InBlock.gif                    fCurrentAngle = ( iTemp * 360 ) / iTatal ;
109ExpandedSubBlockEnd.gif                }

110InBlock.gif                //根据参数绘制扇型
111InBlock.gif
112InBlock.gif                g.DrawPie ( Pens.Black , 100 , 40 , 250 , 250 , fStartAngle , fCurrentAngle ) ;
113InBlock.gif                //以指定色彩填充绘制的扇型
114InBlock.gif
115InBlock.gif                g.FillPie ( new SolidBrush ( GetColor ( i ) ) , 100 , 40 , 250 , 250 , fStartAngle , fCurrentAngle ) ;
116InBlock.gif                fStartAngle += fCurrentAngle ;
117ExpandedSubBlockEnd.gif            }

118InBlock.gif
119InBlock.gif            //画出图片的边框
120InBlock.gif            Pen p = new Pen ( Color.Black , 2 ) ;
121InBlock.gif            g . DrawRectangle ( p , 1 , 1 , 598 , 298 ) ;
122InBlock.gif
123InBlock.gif            //向客户端输出数据流,并以此数据流形成Jpeg图片
124InBlock.gif            bm.Save ( Response . OutputStream , ImageFormat . Jpeg ) ;
125ExpandedSubBlockEnd.gif        }

126InBlock.gif
127ContractedSubBlock.gifExpandedSubBlockStart.gif        Web 窗体设计器生成的代码#region Web 窗体设计器生成的代码
128InBlock.gif        override protected void OnInit(EventArgs e)
129ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
130InBlock.gif            //
131InBlock.gif            // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
132InBlock.gif            //
133InBlock.gif            InitializeComponent();
134InBlock.gif            base.OnInit(e);
135ExpandedSubBlockEnd.gif        }

136InBlock.gif        
137ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
138InBlock.gif        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
139InBlock.gif        /// 此方法的内容。
140ExpandedSubBlockEnd.gif        /// </summary>

141InBlock.gif        private void InitializeComponent()
142ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{    
143InBlock.gif            this.Load += new System.EventHandler(this.Page_Load);
144ExpandedSubBlockEnd.gif        }

145ExpandedSubBlockEnd.gif        #endregion

146InBlock.gif
147ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//// <summary>
148InBlock.gif        /// 获取颜色
149InBlock.gif        /// </summary>
150InBlock.gif        /// <param name="itemIndex">数组的索引</param>
151ExpandedSubBlockEnd.gif        /// <returns></returns>

152InBlock.gif        private Color GetColor ( int itemIndex ) 
153ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
154InBlock.gif             Color MyColor ;
155InBlock.gif             int i = itemIndex ;
156InBlock.gif            switch (i) 
157ExpandedSubBlockStart.gifContractedSubBlock.gif             dot.gif{
158InBlock.gif                  case 0 :
159InBlock.gif                   MyColor = Color.Green;
160InBlock.gif                   return MyColor;
161InBlock.gif                  case 1 :
162InBlock.gif                   MyColor = Color.Red;
163InBlock.gif                    return MyColor;
164InBlock.gif                  case 2:
165InBlock.gif                   MyColor = Color.Yellow;
166InBlock.gif                   return MyColor;
167InBlock.gif                  case 3 :
168InBlock.gif                   MyColor = Color.Blue;
169InBlock.gif                   return MyColor;
170InBlock.gif                  case 4 :
171InBlock.gif                   MyColor = Color.Orange;
172InBlock.gif                   return MyColor;
173InBlock.gif                 case 5 :
174InBlock.gif                   MyColor = Color.Aqua;
175InBlock.gif                   return MyColor;
176InBlock.gif                  case 6:
177InBlock.gif                   MyColor = Color.SkyBlue;
178InBlock.gif                   return MyColor;
179InBlock.gif                  case 7:
180InBlock.gif                   MyColor = Color.DeepPink;
181InBlock.gif                   return MyColor;
182InBlock.gif                  case 8:
183InBlock.gif                   MyColor = Color.Azure;
184InBlock.gif                   return MyColor;
185InBlock.gif                  case 9:
186InBlock.gif                   MyColor = Color.Brown;
187InBlock.gif                   return MyColor;
188InBlock.gif                  case 10:
189InBlock.gif                   MyColor = Color.Pink;
190InBlock.gif                   return MyColor;
191InBlock.gif                  case 11:
192InBlock.gif                   MyColor = Color.BurlyWood;
193InBlock.gif                   return MyColor;
194InBlock.gif                  case 12:
195InBlock.gif                   MyColor = Color.Chartreuse;
196InBlock.gif                   return MyColor;
197InBlock.gif                  default:
198InBlock.gif                   MyColor = Color.Pink;
199InBlock.gif                   return MyColor;
200ExpandedSubBlockEnd.gif            }

201ExpandedSubBlockEnd.gif        }

202ExpandedSubBlockEnd.gif    }

203ExpandedBlockEnd.gif}

204 None.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值