uhey姜新禹:实例301 饼形图表分析产品市场占有率

来源:百度文库 编辑:偶看新闻 时间:2024/05/02 08:55:45
实例301  饼形图表分析产品市场占有率
实例说明
在开发商品销售管理系统过程中,为了清楚地了解产品在市场上的占有率,使用饼形图表是最好的选择。本实例利用饼形图分析商品的市场占有率,运行结果如图13.14所示。
  
图13.14  饼形图表分析产品市场占有率
技术要点
本实例通过SQL语句从数据库中检索出相关数据并进行比例计算。绘制图形时,通过从数据库中检索到不同产品类型将饼形图划分成相应的几部分,再利用FillPie方法将比例绘制出来。绘制完成后,利用Bitmap类的Save方法将图形输出到页面中。Save方法的语法格式如下:
public void Save(Stream stream,ImageFormat format)
参数说明:
stream:将在其中保存图像的Stream。
format:指定保存的图像的格式。
注意:绘图过程中需要引用命名空间using System.Drawing。
实现过程
(1)新建一个网站,将其命名为Ex13_14,默认主页名为Default.aspx。
(2)主要程序代码如下。
private void CreateImage( )
{
//把连接字串指定为一个常量
string strconn = "Server=(local);Database=db_13;Uid=sa;Pwd=";
SqlConnection Con = new SqlConnection(strconn);
Con.Open( );
string cmdtxt = "select *  from tb_13";
SqlCommand Com = new SqlCommand(cmdtxt, Con);
DataSet ds = new DataSet( );
SqlDataAdapter Da = new SqlDataAdapter(Com);
Da.Fill(ds);
Con.Close( );
float Total = 0.0f, Tmp;
int iloop;
for (iloop = 0; iloop < ds.Tables[0].Rows.Count; iloop++)
{
//转换成单精度。也可写成Convert.ToInt32
Tmp = Convert.ToSingle(ds.Tables[0].Rows[iloop]["Approp"]);
Total += Tmp;
}
//设置字体,fonttitle为主标题的字体
Font fontlegend = new Font("verdana", 9),
fonttitle = new Font("verdana", 10, FontStyle.Bold);
//背景宽
int width = 230;
int bufferspace = 15;
int legendheight = fontlegend.Height * (ds.Tables[0].Rows.Count + 1) + bufferspace;
int titleheight = fonttitle.Height + bufferspace;
int height = width + legendheight + titleheight + bufferspace;//白色背景
int pieheight = width;
Rectangle pierect = new Rectangle(0, titleheight, width, pieheight);
//加上各种随机色
ArrayList colors = new ArrayList( );
Random rnd = new Random( );
for (iloop = 0; iloop < ds.Tables[0].Rows.Count; iloop++)
colors.Add(new SolidBrush(Color.FromArgb
(rnd.Next(255), rnd.Next(255), rnd.Next(255))));
//创建一个bitmap实例
Bitmap objbitmap = new Bitmap(width, height);
Graphics objgraphics = Graphics.FromImage(objbitmap);
//画一个白色背景
objgraphics.FillRectangle(new SolidBrush(Color.White), 0, 0, width, height);
//画一个亮黄色背景
objgraphics.FillRectangle(new SolidBrush(Color.LightYellow), pierect);
//以下为画饼图(有几行row画几个)
float currentdegree = 0.0f;
for (iloop = 0; iloop < ds.Tables[0].Rows.Count; iloop++)
{
objgraphics.FillPie((SolidBrush)colors[iloop], pierect, currentdegree,
Convert.ToSingle(ds.Tables[0].Rows[iloop]["Approp"]) / Total *360);
currentdegree += Convert.ToSingle(ds.Tables[0].
Rows[iloop]["Approp"]) / Total *360;
}
//以下为生成主标题
SolidBrush blackbrush = new SolidBrush(Color.Black);
string title = "产品市场占有率调查";
StringFormat stringFormat = new StringFormat( );
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
objgraphics.DrawString(title, fonttitle, blackbrush,
new Rectangle(0, 0, width, titleheight), stringFormat);
objgraphics.DrawRectangle(new Pen(Color.Black, 2),
0, height - legendheight, width, legendheight); //列出各字段所得数目
for (iloop = 0; iloop < ds.Tables[0].Rows.Count; iloop++)
{
objgraphics.FillRectangle((SolidBrush)colors[iloop],
5, height - legendheight + fontlegend.Height * iloop + 5, 10, 10);
objgraphics.DrawString(((String)ds.Tables[0].
Rows[iloop]["ProductName"]) + " —— " + Convert.ToString
(Convert. ToSingle(ds.Tables[0].Rows[iloop]["Approp"])
*100/Total).Substring(0,5)+"%", fontlegend, blackbrush,
20, height - legendheight + fontlegend.Height * iloop + 1);
}
//图像总的高度-一行字体的高度,即是最底行的一行字体高度
(height - fontlegend.Height )
objgraphics.DrawString("商品总数是:" +
Convert.ToString(Total)+"件", fontlegend, blackbrush, 5, height - fontlegend. Height);
Response.ContentType = "image/gif";
objbitmap.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
objgraphics.Dispose( );
objbitmap.Dispose( );
}
举一反三
根据本实例,读者可以绘制:
全国图书市场各类图书销售饼形图;
企业内部各部门业绩图。