ASP.NET图形开发带超链接的饼图

时间:2008-07-04 06:03:16  来源:  作者:  【背景色 杏仁黄 秋叶褐 胭脂红 芥末绿 天蓝 雪青 灰 银河白

  图片服务页面 pieimage.aspx

  本页面用来生成饼图图形的图像文档,该页面没有任何HTML代码,其C#代码也很简单,只有一个Page_Load函数,其代码为

private void Page_Load(object sender, System.EventArgs e) 

    // 获得参数 
    string name = this.Request.QueryString["name"] ; 
    if( name == null ) 
    { 
        return ; 
    } 
    // 获得饼图对象 
    PieShape pie = this.Session[ name ] as PieShape ; 
    if( pie == null ) 
    { 
        return ; 
    } 
    using( Bitmap bmp = pie.CreateBitmap()) 
    { 
        this.Response.ContentType = "image/png"; 
        System.IO.MemoryStream ms = new System.IO.MemoryStream(); 
        bmp.Save( ms , System.Drawing.Imaging.ImageFormat.Png ); 
        ms.WriteTo( this.Response.OutputStream ); 
        ms.Close(); 
    } 
}

  该页面试图从session中加载页面参数指定的名称的饼图文档对象,并利用该文档对象的CreateBmp函数获得一个位图对象,然后输出PNG格式的图像数据。

  这个图片服务页面要正常工作,需要事先将饼图文档对象保存到Session中,然后使用正确的参数来调用这个页面。

  主页面 pie_customers.aspx中,已经将生成的文档对象使用名称pie_customers保存到Session中,同时它生成的HTML代码中使用的图片地址就是 pieimage.aspx?name=pie_custoemrs ,主页面为了图片服务页面正常工作已经做好了充分的准备。由于主页面和图片服务页面密切配合工作,客户端浏览器中才能完整的显示饼图图形。

  在这里使用了位图对象的Save函数来输出图片文档的二进制数据。这里没有直接输出到页面的输出流中,因为那样做是会报错的,这里创建了一个临时的内存流对象,将图片数据输出到这个内存流中,然后将这个内存流中的数据输出到页面输出流中。

  二级主页面 pie_orders.aspx

  在主页面pie_custoemrs.aspx中新增饼图元素时还设置了饼图项目的超链接“pie_orders.aspx?customerid=客户编号”,这样用户点击饼图图片中的热点时就能跳转到二级主页面来显示指定客户的订单详细信息。

  二级主页面和主页面有点类似,都用一个饼图来显示数据。其页面结构和处理过程也差不多,它的Page_Load方法代码为

private void Page_Load(object sender, System.EventArgs e) 

    string customerid = this.Request.QueryString["customerid"] ; 
    if( customerid == null || customerid.Length == 0 ) 
        return ; 
    // 连接数据库 
    using( OleDbConnection conn = new OleDbConnection()) 
    { 
        conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" 
            + this.Server.MapPath("demomdb.mdb"); 
        conn.Open(); 
        // 查询数据库 
        using( OleDbCommand cmd = conn.CreateCommand()) 
        { 
            cmd.CommandText = @" 
SELECT OrderDate AS 订购时间, 
    shipname AS 运输人, 
    shipaddress AS 地点, 
    ( select  
        sum( round( unitprice * quantity * ( 1 - discount) , 3 ) ) 
        from orderdetails 
            where orderdetails.orderid = orders.orderid 
    ) AS 总金额 
FROM orders 
WHERE customerid ='" + customerid + "'" ; 
            OleDbDataReader reader = cmd.ExecuteReader(); 
            // 创建饼图对象 
            PieShape pie = new PieShape(); 
            pie.Width = 400 ; 
            pie.Height = 300 ; 
            System.IO.StringWriter writer = new System.IO.StringWriter(); 
            while( reader.Read()) 
            { 
                double Value = Convert.ToDouble( reader.GetValue( 3 )); 
                string Text = "时间:" + reader.GetValue( 0 ) 
                    + "\r\n人员:" + reader.GetValue( 1 ) 
                    + "\r\n地点:" + reader.GetValue( 2 ) 
                    + "\r\n金额:" + reader.GetValue( 3 ); 
                string Link = "#" ; 
                pie.Add( Value , Text , Link ); 
            }//while 
            reader.Close(); 
            // 刷新饼图状态 
            pie.RefreshState(); 
            this.Session["customerid"] = pie ; 
            this.lblResult.Text = pie.GetHtmlString("pieimage.aspx?name=customerid"); 
            this.DataGrid1.DataSource = pie ; 
            this.DataGrid1.DataBind(); 
        }//using 
    }//using 
}

  本页面中,首先从页面参数中获得客户编号,然后连接数据库,进行SQL查询,获得指定客户编号的所有订单记录。然后将查询所得数据填充到一个饼图文档对象,然后将该文档对象使用名称customerid保存到Session中,这样未来运行的图片服务页面就从Session中获得名称为cusotmerid的饼图文档对象来显示饼图图片了。


共6页: 上一页 [1] [2] [3] [4] [5] 6 下一页

文章评论

共有 0位网翼网友发表了评论 查看完整内容