linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘网络学院网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > asp.net >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·NetBPM工作流的一个示例:请假
·Office Web Components(OWC)绘
·asp.net正则表达式语法
·asp.net 2.0 ajax中使用PopupC
·Ado.Net读取Excel常见问题总结
·数据源为空时如何让GridView显
·如何让UpdatePanel支持文件上传
·C#.Net的常见面试试题和参考答
·asp.net ajax客户端编程+jquer
·Brettle.Web.NeatUpload.dll支
·ASP.NET使用Cookie
·ASP.NET DEMO 15: 同时支持行单
·如何使IE的后退按钮无效
·如何在ASP.NET中用OWC绘制图表
·asp.net:正确判断当前用户角色
最新文章
·Ajax Control Toolkit Animati
·讨论一下类似BlogEngine内一次
·使用CSS+SiteMap+UserControl+
·Asp.net中多彩下拉框的实现
·浅谈ASP.NET的Postback
·分清ASP.NET AJAX中的Extender
·Tip:在使用AjaxControlTookit
·有关注册DataItem的一些可能被
·IIRF(Ionic's Isapi Rewrite
·asp.net 客户端回调功能的实现
·关于控件部分的看法--读Progra
·为什么在vista上做开发
·如何封装JS和CSS文件为服务器端
·岂今我看过的最强的排序算法
·设计模式学习笔记之单件模式
Google
 
asp.net中用VML动态的画出数据分析图表详解
[ 作者:  加入时间:2007-10-29 14:07:23  来自:Linux联盟收集整理 ]
在开发系统的时候有许多数据分析需要用图形的方式来表现出,这样更直观又清淅。如果我们使用高级去动态 rETLinux联盟
  生成统计图表的话不但编写起来非常困难,而且实用性不是很好,从美观的角度上讲也是很设计的。然而Microsoft公司提供了一个专们的矢量画图语言,这就是VML. rETLinux联盟
   rETLinux联盟
   如果要用VML去画静态页面的话那是比较好看也好操作,但实用性不是很高。但要是画出来的图所表示的数据 rETLinux联盟
  是从数据库里面读取下来的可以动态表示要统计的内容的话,那实用性就不言而喻了。 rETLinux联盟
   rETLinux联盟
   最近我们也要做一个数据统计图表,我想如果能把VML画图做成一个控件那该多很,做自定义控件(本人才疏学浅)我不怎么会做,但我们公司有个.NET很牛 的人,我经常看到他重写.net里自带的控件使这些控件变得更好用,于是我也产生一种想法,看能不能把VML也嵌套进去.结果做的还是有点起色.下面跟大 家分享一下. rETLinux联盟
   rETLinux联盟
  我是把VML图表用Lable控件显示出来的,给Lable类添加了一些自定义属性.(在下面的代码里面有的属性还没有用到用与以后扩展) rETLinux联盟
   rETLinux联盟
  页面代码如下 rETLinux联盟
  <%@ Page Language="C#" AutoEventWireup="true" CodeFile="DrawTest.aspx.cs" Inherits="DrawTest" %> rETLinux联盟
   rETLinux联盟
  <html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" rETLinux联盟
   xmlns="http://www.w3.org/1999/xhtml"> rETLinux联盟
  <head id="Head1" runat="server"> rETLinux联盟
   <title>Page</title> rETLinux联盟
   <style type="text/css"> rETLinux联盟
  v\:*{ behavior: url(#default#VML) } rETLinux联盟
  o\:*{ behavior: url(#default#VML) } rETLinux联盟
  .changeBg{FILTER: progid:DXImageTransform.Microsoft.Gradient(gradientType=0,startColorStr=#FFFFFF,endColorStr=#9DCDFA); rETLinux联盟
  } rETLinux联盟
  .shadwDiv{ width:600px; height:500px; text-align:center; filter : progid:DXImageTransform.Microsoft.DropShadow ( enabled=true , color=#000 , offX=10 , offY=10 , positive=true ) ; } rETLinux联盟
  </style> rETLinux联盟
   rETLinux联盟
  </head> rETLinux联盟
  <body> rETLinux联盟
   <form id="form1" runat="server"> rETLinux联盟
   <div class="shadwDiv" > rETLinux联盟
   <div style="padding-top: 30px; border: solid 2px #BBBBBB; background-color: #EFEFEF; rETLinux联盟
   width: 600px; height: 500px;"> rETLinux联盟
   <asp:VmlLabel ID="labTest3" runat="server" XWidth="400" YHeight="400" YPosition="50" rETLinux联盟
   IsDrawVML="True" BgDistance="10" EnableViewState="False" ZhuWidth="20" YItemWidth="40" rETLinux联盟
   CssClass="changeBg" BorderColor="White" BorderWidth="0px" LineColor="#4CAFFE" rETLinux联盟
   XSign="(年份)" YSign="(万/单位)" XPosition="50" IsZhuOrBing="Zhu" Redii="80"></asp:VmlLabel> rETLinux联盟
   </div> rETLinux联盟
   </div> rETLinux联盟
   </form> rETLinux联盟
  </body> rETLinux联盟
  </html> rETLinux联盟
   rETLinux联盟
  这里面的.<html>标签里的” xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" rETLinux联盟
   rETLinux联盟
  ”和. v\:*{ behavior: url(#default#VML) } rETLinux联盟
   rETLinux联盟
  o\:*{ behavior: url(#default#VML) } rETLinux联盟
   rETLinux联盟
  是必不可少的. rETLinux联盟
   rETLinux联盟
  下面是CS代码部分 rETLinux联盟
  private int xposition; rETLinux联盟
   private int yposition; rETLinux联盟
   private int xwidth; rETLinux联盟
   private int yheight; rETLinux联盟
   private bool isdrawVML; rETLinux联盟
   private int bgdistance;//背景距离(斜线之间的垂直距离) rETLinux联盟
   private int zhuWidth; rETLinux联盟
   private string lineColor; rETLinux联盟
   private int yItemWidth; rETLinux联盟
   private string xSign;//X轴标记 rETLinux联盟
   private string ySign;//Y轴标记 rETLinux联盟
   private List<VmlDataSource> datasource; rETLinux联盟
   private IszhuOrBing isZhuOrBing; rETLinux联盟
   private int radii;//画饼图要用的半径 rETLinux联盟
   rETLinux联盟
   public IszhuOrBing IsZhuOrBing rETLinux联盟
   { rETLinux联盟
   get { return isZhuOrBing; } rETLinux联盟
   set { isZhuOrBing = value; } rETLinux联盟
   } rETLinux联盟
   #region 属性的定义 rETLinux联盟
   rETLinux联盟
   /// <summary> rETLinux联盟
   /// 画饼图的半径 rETLinux联盟
   /// </summary> rETLinux联盟
   public int Redii rETLinux联盟
   { rETLinux联盟
   get { return radii; } rETLinux联盟
   set { radii = value; } rETLinux联盟
   } rETLinux联盟
   /// <summary> rETLinux联盟
   /// X轴的位置 rETLinux联盟
   /// </summary> rETLinux联盟
   public int XPosition rETLinux联盟
   { rETLinux联盟
   get { return xposition; } rETLinux联盟
   set { xposition = value; } rETLinux联盟
   } rETLinux联盟
   rETLinux联盟
   /// <summary> rETLinux联盟
   /// Y轴位置 rETLinux联盟
   /// </summary> rETLinux联盟
   public int YPosition rETLinux联盟
   { rETLinux联盟
   get { return yposition; } rETLinux联盟
   set { yposition = value; } rETLinux联盟
   } rETLinux联盟
   // rETLinux联盟
   /// <summary> rETLinux联盟
   /// X轴宽度 rETLinux联盟
   /// </summary> rETLinux联盟
   public int XWidth rETLinux联盟
   { rETLinux联盟
   get { return xwidth; } rETLinux联盟
   set { xwidth = value; } rETLinux联盟
   } rETLinux联盟
   // rETLinux联盟
   /// <summary> rETLinux联盟
   /// Y轴高度 rETLinux联盟
   /// </summary> rETLinux联盟
   public int YHeight rETLinux联盟
   { rETLinux联盟
   get { return yheight; } rETLinux联盟
   set { yheight = value; } rETLinux联盟
   } rETLinux联盟
   /// <summary> rETLinux联盟
   /// 是否是画VML图 rETLinux联盟
   /// </summary> rETLinux联盟
   public bool IsDrawVML rETLinux联盟
   { rETLinux联盟
   get { return isdrawVML; } rETLinux联盟
   set { isdrawVML = value; } rETLinux联盟
   } rETLinux联盟
   /// <summary> rETLinux联盟
   /// 背景距离(斜线之间的垂直距离) rETLinux联盟
   /// </summary> rETLinux联盟
   public int BgDistance rETLinux联盟
   { rETLinux联盟
   get rETLinux联盟
   { rETLinux联盟
   return bgdistance; rETLinux联盟
   } rETLinux联盟
   set rETLinux联盟
   { rETLinux联盟
   if (value <= 0) rETLinux联盟
   bgdistance = 10; rETLinux联盟
   else rETLinux联盟
   bgdistance = value; rETLinux联盟
   } rETLinux联盟
   } rETLinux联盟
   rETLinux联盟
   /// <summary> rETLinux联盟
   /// 柱子的宽度 rETLinux联盟
   /// </summary> rETLinux联盟
   public int ZhuWidth rETLinux联盟
   { rETLinux联盟
   get { return zhuWidth; } rETLinux联盟
   set { zhuWidth = value; } rETLinux联盟
   } rETLinux联盟
   rETLinux联盟
   /// <summary> rETLinux联盟
   /// 柱子的颜色 rETLinux联盟
   /// </summary> rETLinux联盟
   public string LineColor rETLinux联盟
   { rETLinux联盟
   get { return lineColor; } rETLinux联盟
   set { lineColor = value; } rETLinux联盟
   } rETLinux联盟
   rETLinux联盟
   /// <summary> rETLinux联盟
   /// Y轴方向的间距 rETLinux联盟
   /// </summary> rETLinux联盟
   public int YItemWidth rETLinux联盟
   { rETLinux联盟
   get { return yItemWidth; } rETLinux联盟
   set { yItemWidth = value; } rETLinux联盟
   } rETLinux联盟
   /// <summary> rETLinux联盟
   /// X轴标识 rETLinux联盟
   /// </summary> rETLinux联盟
   public string XSign rETLinux联盟
   { rETLinux联盟
   get { return xSign; } rETLinux联盟
   set { xSign = value; } rETLinux联盟
   } rETLinux联盟
   /// <summary> rETLinux联盟
   /// Y轴标识 rETLinux联盟
   /// </summary> rETLinux联盟
   public string YSign rETLinux联盟
   { rETLinux联盟
   get { return ySign; } rETLinux联盟
   set { ySign = value; } rETLinux联盟
   } rETLinux联盟
   /// <summary> rETLinux联盟
   /// 数据源(柱子高度) rETLinux联盟
   /// </summary> rETLinux联盟
   public List<VmlDataSource> DataSource rETLinux联盟
   { rETLinux联盟
   get { return datasource; } rETLinux联盟
   set { datasource = value; } rETLinux联盟
   } rETLinux联盟
   rETLinux联盟
   #endregion rETLinux联盟
  判断是画柱图还是饼图. rETLinux联盟
   //画VML图 rETLinux联盟
   StringBuilder sbText = new StringBuilder(); rETLinux联盟
   string strHeight = ""; rETLinux联盟
   string strTop = ""; rETLinux联盟
   rETLinux联盟
   public void DrawVml() rETLinux联盟
   { rETLinux联盟
   rETLinux联盟
   if (isdrawVML == true) rETLinux联盟
   {// rETLinux联盟
   if (isZhuOrBing== IszhuOrBing.Bing) rETLinux联盟
   { rETLinux联盟
   DrawBingImage(); rETLinux联盟
   } rETLinux联盟
   else if (isZhuOrBing == IszhuOrBing.Zhu) rETLinux联盟
   { rETLinux联盟
   DrawZhuImage(); rETLinux联盟
   } rETLinux联盟
   } rETLinux联盟
   } rETLinux联盟
  ***IsZhuOrBing是一个自定义的枚举类型. rETLinux联盟
   rETLinux联盟
   //柱子一升的脚本 rETLinux联盟
   private string RegisterScript() rETLinux联盟
   { rETLinux联盟
   string m_strScript = " <script language='javascript' type='text/javascript'>" rETLinux联盟
   +"var gao=0;" rETLinux联盟
   +"var ProcID=0;" rETLinux联盟
   +"var ProcName=null;" rETLinux联盟
   +"var i=0;" rETLinux联盟
   +"var HeightContent=document.getElementById('heightDataSource').value;" rETLinux联盟
   +"var arrHeight=new Array();" rETLinux联盟
   +"var arrTop=new Array();" rETLinux联盟
   +"arrHeight=HeightContent.split(',');" rETLinux联盟
   +"var showBar=null;" rETLinux联盟
   +"function AllPlay()" rETLinux联盟
   +"{" rETLinux联盟
   +" i++;" rETLinux联盟
   rETLinux联盟
   +" gao=0;" rETLinux联盟
   +" var procBarID='DataZhu'+i;"//; rETLinux联盟
   +" Play(procBarID); " rETLinux联盟
   +"}" rETLinux联盟
   +"function Play(procBarID)" rETLinux联盟
   +"{ " rETLinux联盟
   +" var procBar=document.getElementById(procBarID);" rETLinux联盟
   +" if(procBar!=null)" rETLinux联盟
   +" {" rETLinux联盟
   +" ProcName=procBar;" rETLinux联盟
   +" PlaySub();" rETLinux联盟
   +"}" rETLinux联盟
   +"}" rETLinux联盟
   +"function PlaySub()" rETLinux联盟
   +"{" rETLinux联盟
   +" var procBar=ProcName;" rETLinux联盟
   +" showBar=document.getElementById('ShowData'+i);" rETLinux联盟
   +" showBar.style.display='block';" rETLinux联盟
   +"gao++;" rETLinux联盟
   +"var ygao=parseInt(procBar.style.height);" rETLinux联盟
   +"var ytop=parseInt(procBar.style.top);" rETLinux联盟
   +"if(ygao<arrHeight[i-1])" rETLinux联盟
   +"{ " rETLinux联盟
   +" procBar.style.top=ytop-gao;" rETLinux联盟
   +" procBar.style.height=ygao+gao;" rETLinux联盟
   +" showBar.style.top=ytop-gao-25;" rETLinux联盟
   +"setTimeout(PlaySub,20);" rETLinux联盟
   +"}" rETLinux联盟
   +"else" rETLinux联盟
   +"{ " rETLinux联盟
   +" AllPlay();" rETLinux联盟
   +"}" rETLinux联盟
   +"}" rETLinux联盟
   +"</script>"; rETLinux联盟
   return m_strScript; rETLinux联盟
   } rETLinux联盟
  上面的那段代码是要向客户端注册的JS脚本用于,画柱图时渐长效果的. rETLinux联盟
  开始画VML图 rETLinux联盟
  //画柱图. rETLinux联盟
   public void DrawZhuImage() rETLinux联盟
   { rETLinux联盟
   base.Text = ""; rETLinux联盟
   //画Div rETLinux联盟
   //sbText.Append("<div style=' border:solid 1px red;width:" + (xwidth+10) + "; height:" + (yheight+10) + ";;filter : progid:DXImageTransform.Microsoft.DropShadow ( enabled=true , color=#66333333 , offX=4 , offY=4 , positive=true );'>"); rETLinux联盟
   sbText.Append("<div id='PicDiv' style='left:0;position:relative; top:0; width:" + xwidth + "; height:" + yheight + ";text-align:left;'>"); rETLinux联盟
   //base.Style.Value = "left:" + xposition + ";position:relative; top:" + yposition + "; width:" + (xwidth+20) + "; height:" + (20+yheight) + ";'"; rETLinux联盟
   //画X轴 rETLinux联盟
   sbText.Append("<v:line id='Xzhou' from='0," + yheight + "' to='" + xwidth + "," + yheight + "'>" rETLinux联盟
   + "<v:stroke EndArrow='Classic'/></v:line><v:TextBox style='position:absolute; width:100px;top:" + (yheight + 10) + ";left:" + (xwidth) + "'>" + xSign + "</v:TextBox>"); rETLinux联盟
   //画X轴方向的线条 rETLinux联盟
   int HaveData = ComputeX(xwidth); rETLinux联盟
   //if (HaveData == 0) rETLinux联盟
   //{ rETLinux联盟
   // sbText.Append("</div>"); rETLinux联盟
   // base.Text = sbText.ToString(0, sbText.Length); rETLinux联盟
   // return; rETLinux联盟
   //} rETLinux联盟
   //画Y轴 rETLinux联盟
   sbText.Append("<v:line id='Yzhou' from='0," + yheight + "' to='0,0'><v:stroke EndArrow='Classic'/><v:TextBox style=' width:100px;padding-left:10px;'>" + ySign + "</v:TextBox></v:line>"); rETLinux联盟
   //画Y轴方向的线条 rETLinux联盟
   ComputeY(yheight); rETLinux联盟
   rETLinux联盟
   //画DIV结束标记 rETLinux联盟
   sbText.Append("</div>"); rETLinux联盟
   //画隐形文本框 rETLinux联盟
   sbText.Append("<input type='hidden' value='" + strHeight.Substring(0, strHeight.Length - 1) + "' name='heightDataSource' id='heightDataSource'/>"); rETLinux联盟
   sbText.Append("<input type='hidden' value='" + strTop.Substring(0, strTop.Length - 1) + "' name='topDataSource' id='topDataSource'/>"); rETLinux联盟
   //给Lable控件的Text赋值 rETLinux联盟
   base.Text = sbText.ToString(0, sbText.Length); rETLinux联盟
   Page.RegisterStartupScript("zhuup", RegisterScript()); rETLinux联盟
   } rETLinux联盟
   // rETLinux联盟
   private int ComputeX(int XWidth) rETLinux联盟
   { //柱子颜色数组 rETLinux联盟
   string[,] ZColor = new string[6, 2]; rETLinux联盟
   ZColor[0, 0] = "#666699"; ZColor[0, 1] = "#d9d9e5"; rETLinux联盟
   ZColor[1, 0] = "#00ff00"; ZColor[1, 1] = "#d1ffd1"; rETLinux联盟
   ZColor[2, 0] = "#ff0000"; ZColor[2, 1] = "#ffbbbb"; rETLinux联盟
   ZColor[3, 0] = "#ff9900"; ZColor[3, 1] = "#ffe3bb"; rETLinux联盟
   ZColor[4, 0] = "#33cccc"; ZColor[4, 1] = "#cff4f3"; rETLinux联盟
   ZColor[5, 0] = "#993300"; ZColor[5, 1] = "#ffc7ab"; rETLinux联盟
   rETLinux联盟
   XWidth -= 10;//箭头下面的长度 rETLinux联盟
   rETLinux联盟
   int ColorIndex = 0; rETLinux联盟
   double height = 0; rETLinux联盟
   int Zhuposition = 0; rETLinux联盟
   int Count = this.DataSource==null?XWidth:this.DataSource.Count; rETLinux联盟
   int num=1; rETLinux联盟
   //Count = 0; rETLinux联盟
   //if (Count == 0) rETLinux联盟
   //{ rETLinux联盟
   // sbText.Append("<div style='font-size:14px;color:red;'>暂无数据</div>"); rETLinux联盟
   // return 0; rETLinux联盟
   //} rETLinux联盟
   int UnitLength = XWidth / Count;//计算单位长度 rETLinux联盟
   foreach (VmlDataSource var in this.datasource) rETLinux联盟
   { rETLinux联盟
   //画X轴下标 rETLinux联盟
   sbText.Append("<v:line from='" + num * UnitLength + "," + yheight + "' to='" + num * UnitLength + "," + (yheight + bgdistance) + "'>" rETLinux联盟
   + "</v:line><v:shape style='left:" + (num * UnitLength -50) + ";top:" + yheight + ";'><v:textbox>" + var.Key + "</v:textbox></v:shape>"); rETLinux联盟
   rETLinux联盟
   height = var.value; rETLinux联盟
   Zhuposition = ((num - 1) * UnitLength + UnitLength / 2) - (zhuWidth / 2); rETLinux联盟
   rETLinux联盟
   if (ColorIndex >= ZColor.Length / 2) rETLinux联盟
   { rETLinux联盟
   ColorIndex = 0; rETLinux联盟
   } rETLinux联盟
   //sbText.Append("<v:rect id='DataZhu"+num+"' style='z-index:1; position:absolute; top:" + (yheight - height) + ";" rETLinux联盟
   sbText.Append("<v:rect id='DataZhu"+num+"' style='z-index:1; position:absolute; top:" + yheight + ";" rETLinux联盟
   + "left:" + Zhuposition + ";width:" + zhuWidth + ";height:0;' fillcolor='" + ZColor[ColorIndex, 0] + "'>" rETLinux联盟
   + "<v:fill color2='" + ZColor[ColorIndex, 1] + "' rotate='t' type='gradient'/>" rETLinux联盟
   + "<v:extrusion v:ext='view' backdepth='" + (2 * bgdistance) + "' color='" + ZColor[ColorIndex, 0] + "' brightness='0.2' on='t'/></v:rect>" rETLinux联盟
   + "<v:TextBox id='ShowData"+num+"' style='position:absolute;display:none;z-index:2;top:" + (yheight - 20) + "; left:" + Zhuposition + "'>" + height + "</v:TextBox>"); rETLinux联盟
   strHeight += height + ","; rETLinux联盟
   strTop += (yheight - height) + ","; rETLinux联盟
   ColorIndex++; rETLinux联盟
   num++; rETLinux联盟
   } rETLinux联盟
   return 1; rETLinux联盟
   } rETLinux联盟
   // rETLinux联盟
   private void ComputeY(int YHeight) rETLinux联盟
   { rETLinux联盟
   YHeight -= 10;//箭头下面的长度 rETLinux联盟
   if (yItemWidth > 0) rETLinux联盟
   { rETLinux联盟
   int Units = YHeight / yItemWidth;//计算单位长度 rETLinux联盟
   for (int i = 0; i <= Units; i++) rETLinux联盟
   { rETLinux联盟
   int areaLenght = yheight - (i * yItemWidth); rETLinux联盟
   sbText.Append("<v:line from='0," + areaLenght + "' to='" + bgdistance + "," + (areaLenght - bgdistance) + "' color='" + lineColor + "'><v:stroke color='" + lineColor + "'/></v:line>" rETLinux联盟
   + "<v:line from='0," + areaLenght + "' to='-10," + areaLenght + "'>" rETLinux联盟
   + "</v:line><v:shape style='top:" + (areaLenght-10) + ";left:-50;'><v:TextBox>" + i * yItemWidth + "</v:TextBox></v:shape>" rETLinux联盟
   + "<v:line from='" + bgdistance + "," + (areaLenght - bgdistance) + "' to='" + xwidth + "," + (areaLenght - bgdistance) + "'><v:stroke color='" + lineColor + "'/></v:line>"); rETLinux联盟
   } rETLinux联盟
   //画Y轴平行的线 rETLinux联盟
   sbText.Append("<v:line id='YzhouPX' from='" + bgdistance + "," + (yheight - bgdistance) + "' to='" + bgdistance + "," + ((yheight - (Units * yItemWidth)) - bgdistance) + "'><v:stroke color='" + lineColor + "'/></v:line>"); rETLinux联盟
   } rETLinux联盟
   } rETLinux联盟
   #endregion rETLinux联盟
   #region 画饼图 rETLinux联盟
   private void DrawBingImage() rETLinux联盟
   { rETLinux联盟
   base.Text = ""; rETLinux联盟
   //定义颜色 rETLinux联盟
   string[] Colors = new string[6]; rETLinux联盟
   Colors[0] = "#666699"; rETLinux联盟
   Colors[1] = "#00ff00"; rETLinux联盟
   Colors[2] = "#ff0000"; rETLinux联盟
   Colors[3] = "#ff9900"; rETLinux联盟
   Colors[4] = "#33cccc"; rETLinux联盟
   Colors[5] = "#993300"; rETLinux联盟
   //开始标记 rETLinux联盟
   //sbText.Append("<div id='pic' style='position:absolute;'>"); rETLinux联盟
   // rETLinux联盟
   double TotalCount = 0; rETLinux联盟
   foreach (VmlDataSource vd in datasource) rETLinux联盟
   { rETLinux联盟
   TotalCount += vd.value; rETLinux联盟
   } rETLinux联盟
   //计算单位数字的角度 rETLinux联盟
   double UnitAngle = 360 / TotalCount; rETLinux联盟
   //存储画下弧度的起点 rETLinux联盟
   double TempUnitArc=0.00; rETLinux联盟
   //存储前面已有的角度 rETLinux联盟
   double TempUnitAngle=0.00; rETLinux联盟
   int i = 0; rETLinux联盟
   string ColorInfo = ""; rETLinux联盟
   sbText.Append("<div id='PicDiv' style='left:0;position:relative; top:0; width:" + xwidth + "; height:" + yheight + ";text-align:left; font-size:12px; border:solid 1px red;'>"); rETLinux联盟
   sbText.Append("<div style='left:" + (radii+xposition) + ";position:relative; top:" + (radii+yposition) + ";'>"); rETLinux联盟
   sbText.Append("<v:TextBox id='msgShow' inset='5pt,5pt,5pt,5pt' style='width:" + Colors[i] + ";position:absolute;z-index:2;display:none;background-color:red; font-size:12px;'></v:TextBox>"); rETLinux联盟
   foreach (VmlDataSource vd in datasource) rETLinux联盟
   { rETLinux联盟
   rETLinux联盟
   //计算弧度 rETLinux联盟
   double UnitArc = (vd.value * UnitAngle + TempUnitAngle) * Math.PI / 180; rETLinux联盟
   //计算开始和结束位置 rETLinux联盟
   double sx = Math.Round(Math.Cos(TempUnitArc) * radii);//Math.Sign( rETLinux联盟
   double sy = Math.Round(Math.Sin(TempUnitArc) * radii); rETLinux联盟
   double ex = Math.Round(Math.Cos(UnitArc) * radii); rETLinux联盟
   //double aa = Math.Sin(UnitArc) * radii; rETLinux联盟
   //double bb = Math.Round(Math.Sin(UnitArc) * radii,4); rETLinux联盟
   double ey = Math.Round(Math.Sin(UnitArc) * radii); rETLinux联盟
   //所占百份比 rETLinux联盟
   double rate = Math.Round(vd.value * 100 / TotalCount, 2); rETLinux联盟
   //开始画图 rETLinux联盟
   sbText.Append("<v:shape ID='ccc' style='position:absolute;width:200px; height:200px;'coordsize='200,200' fillcolor='#" + Colors[i] + "' filled='t' strokecolor='#FFFFFF'"); rETLinux联盟
   sbText.Append(" path='m0,0 l" + sx + "," + sy + " ar-" + radii + ",-" + radii + "," + radii + "," + radii + "," + ex + "," + ey + "," + sx + "," + sy + " l0,0 x e'"); rETLinux联盟
   sbText.Append("title='名称:" + vd.key + "\r数量:" + vd.value + "\r所占比例:" + rate + "%'></v:shape>"); rETLinux联盟
   //给临时变量赋值 rETLinux联盟
   TempUnitAngle += vd.value * UnitAngle; rETLinux联盟
   TempUnitArc = UnitArc; rETLinux联盟
   //显示颜色说明框 rETLinux联盟
   ColorInfo += "<div style='position:relative;padding-top:3px;padding-bottom:3px;' title='所占比例:" + rate + "%' onMouseOver='this.style.border=\"solid 1px #D38F61\"' onMouseOut='this.style.border=\"none\"'>" rETLinux联盟
   + " <v:rect style='position:relative;width:20px;height:20px;' fillcolor='" + Colors[i] + "'/>" + vd.key + ":" + vd.value + " (" + rate + "%)</div>" rETLinux联盟
   ; rETLinux联盟
   //如果颜色遍历完了,还有数据要显示那就重新再一次遍历。占:" + (Math.Round(vd.value * 100 / TotalCount, 2)) + "% rETLinux联盟
   i = (i >= Colors.Length ? 0 : ++i); rETLinux联盟
   } rETLinux联盟
   sbText.Append("</div>"); rETLinux联盟
   sbText.Append("<div style='border:solid 1px #000;padding:10px;margin-right:10px;position:relative;left:" + (2 * radii + 20 + xposition) + "px;top:10px;width:" + (xwidth - (2 * radii + 40 + xposition)) + ";'>"); rETLinux联盟
   //sbText.Append("<div style='padding-left:10px;width:" + (xwidth - (2 * radii +30+ xposition)) +";height:auto;'>"); rETLinux联盟
   //总数 rETLinux联盟
   sbText.Append("<div style='background-color:#000;color:#fff;'>总数据:"+TotalCount+"</div>"); rETLinux联盟
   sbText.Append(ColorInfo); rETLinux联盟
   sbText.Append("</div></div>"); rETLinux联盟
   this.Text = sbText.ToString(); rETLinux联盟
   } rETLinux联盟
   #endregion rETLinux联盟
   /// <summary> rETLinux联盟
   /// 控件加载时画图 rETLinux联盟
   /// </summary> rETLinux联盟
   /// <param name="e"></param> rETLinux联盟
   protected override void OnLoad(EventArgs e) rETLinux联盟
   { rETLinux联盟
   base.OnLoad(e); // Page.RegisterStartupScript("HelloWord", "<script>alert('BBB');</script>"); rETLinux联盟
   DrawVml(); rETLinux联盟
   //Page.RegisterStartupScript("", "<script>alert('aaa');</script>"); rETLinux联盟
   } rETLinux联盟
   protected override void OnPreRender(EventArgs e) rETLinux联盟
   { rETLinux联盟
   base.OnPreRender(e); rETLinux联盟
   Page.RegisterStartupScript("", "<script>AllPlay();</script>"); rETLinux联盟
   } rETLinux联盟
   } rETLinux联盟
  *注意里面的数据源类型和枚举在下面定义. rETLinux联盟
   /// <summary> rETLinux联盟
   /// 画图时用的数据源 rETLinux联盟
   /// </summary> rETLinux联盟
   public class VmlDataSource rETLinux联盟
   { rETLinux联盟
   public VmlDataSource() rETLinux联盟
   { rETLinux联盟
   rETLinux联盟
   } rETLinux联盟
   rETLinux联盟
   public string key; rETLinux联盟
   public double value; rETLinux联盟
   /// <summary> rETLinux联盟
   /// 键值 rETLinux联盟
   /// </summary> rETLinux联盟
   public string Key rETLinux联盟
   { rETLinux联盟
   get { return key; } rETLinux联盟
   set { key = value; } rETLinux联盟
   } rETLinux联盟
   public double Value rETLinux联盟
   { rETLinux联盟
   get rETLinux联盟
   { rETLinux联盟
   if (this.value.GetType() != Type.GetType("System.Int32")) rETLinux联盟
   return 0; rETLinux联盟
   else rETLinux联盟
   return this.value; rETLinux联盟
   } rETLinux联盟
   set rETLinux联盟
   { rETLinux联盟
   this.value = value; rETLinux联盟
   } rETLinux联盟
   } rETLinux联盟
   rETLinux联盟
   } rETLinux联盟
   /// <summary> rETLinux联盟
   /// 枚举画图的类型 rETLinux联盟
   /// </summary> rETLinux联盟
   public enum IszhuOrBing rETLinux联盟
   { rETLinux联盟
   // rETLinux联盟
   Zhu=0, rETLinux联盟
   // rETLinux联盟
   Bing=1 rETLinux联盟
   } rETLinux联盟
  } rETLinux联盟
  整个过程就是这样了,不过这只是个粗略的过程里面还很多的BUG没有解觉掉.画数据统计的图表完成了. rETLinux联盟
  效果图如下. rETLinux联盟
   rETLinux联盟
   rETLinux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
无相关信息