用c#做的控件—用vml生成饼图

原创 2004年12月30日 11:28:00

 

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Collections;
using System.Collections.Specialized;

namespace Controls.Custom
{
    /// <summary>
    /// ChartReport 的摘要说明。
    /// </summary>
    [DefaultProperty("Text"),
    ToolboxData("<{0}:ChartPieReport runat=server></{0}:ChartReport>")]
    public class ChartPieReport:Control
    {
        private int max;
        private string  data;
        private string dataInfor;
        private string color;
        private string strPie;
        string[] tmpdata;//传的数值
        string[] tmpdatainfor;//传的对应内容
        string[] tmpColor;
        string str_temp="";
        string strdivdatainfo="";
        ArrayList resultData=new ArrayList();
        int  r=2000;
       
        int  colorInfoTop = -2000;
        int  dataInfoTop = 10;
        double total=0;
        #region 属性
        [Bindable(true),Category("Appearance"),DefaultValue("")]
        public int Max
        {
            get
            {
                return max;
            }
            set
            {
                max=value;
            }
        }
        [Bindable(true),Category("Data"),DefaultValue("")]
        public string Data
        {
            get
            {
                return data;
            }
            set
            {
                data=value;
            }
        }
        [Bindable(true),Category("Data"),DefaultValue("")]
        public string DataInfor
        {
            get
            {
                return DataInfor ;
            }
            set
            {
                dataInfor=value;
            }
        }
        [Bindable(true),Category("Data"),DefaultValue("")]
        public string Color
        {
            get
            {
                return color;
            }
            set
            {
                color=value;
            }
        }
        #endregion
        public ChartPieReport()
        {
           
            strPie+="<v:group id=/"p/" CoordOrig=/"3000,2700/" CoordSize=/"7200,4050/" style=/"WIDTH:480px;POSITION:relative;HEIGHT:270px/">";
            strPie+="<v:rect style=/"LEFT:-3000px;WIDTH:9600px;POSITION:relative;TOP:-2700px;HEIGHT:5400px/" fillcolor=/"white/"";
            strPie+="strokecolor=/"black/" coordsize=/"21600,21600/">";
            strPie+="<v:shadow on=/"t/" type=/"single/" color=/"silver/" offset=/"4pt,3pt/"></v:shadow>";
            strPie+="</v:rect>";
            strPie+="<v:group id=/"group1/" CoordSize=/"6600,5400/" style=/"WIDTH:8000px;POSITION:absolute;HEIGHT:5400px/">";
            strdivdatainfo="<div id=/"dataInfo/">";
           
        }
        protected override void Render(HtmlTextWriter output)
        {
            tmpdata=data.Split(new char[]{','});//传的数值
            tmpdatainfor=dataInfor.Split(new char[]{','});//传的对应内容
            tmpColor=color.Split(new char[]{','});//颜色
            showMorePie();   
            this.Page.Response.Write (strPie);
        }
        #region 方法
        private void showMorePie()
        {
            //首先取数字的绝对值
            for(int i=0;i<tmpdata.Length;i++)
            {
                tmpdata[i]=Convert.ToString(Math.Abs(Convert.ToDouble(tmpdata[i])));
                total+=Convert.ToDouble(tmpdata[i]);
            }
            //冒泡排序
            object temp;
            for(int i=0;i<tmpdata.Length-1;i++)
            {
                for(int j=i+1;j<tmpdata.Length;j++)
                {
                    if(Convert.ToDouble(tmpdata[i])<Convert.ToDouble(tmpdata[j]))
                    {
                        temp=Convert.ToDouble(tmpdata[i]);
                        tmpdata[i]=tmpdata[j];
                        tmpdata[j]=temp.ToString();

                        temp=tmpdatainfor[i];
                        tmpdatainfor[i]=tmpdatainfor[j];
                        tmpdatainfor[j]=temp.ToString();
                    }
                }
            }
            int loop=tmpdata.Length;
            //判断是不是给出的最大的值与实际给的内容不符合
            if(loop>max)
            {
                for(int i=max;i<tmpdata.Length;i++)
                    tmpdata[max-1]+=Convert.ToDouble(tmpdata[i]);
                tmpdatainfor[max-1]="其他";
                loop=max;

            }
            for(int i=0;i<loop;i++)
            {
                resultData.Add(Convert.ToDouble(tmpdata[i])/total);
                showColorInfo(i);
                showDataInfo(i);

            }
            strdivdatainfo+="</div>";
            createPie(0,Convert.ToDouble(resultData[0]),tmpColor[0].ToString(),tmpdatainfor[0]+":"+tmpdata[0].ToString());
            double currentValue=Convert.ToDouble(resultData[0]);
            for(int i=1;i<loop-1;i++)
            {
                createPie(currentValue,Convert.ToDouble(currentValue+Convert.ToDouble(resultData[i])),tmpColor[i].ToString(),tmpdatainfor[i]+":"+tmpdata[i].ToString());
                currentValue+=Convert.ToDouble(resultData[i]);
            }
            createPie(currentValue,360,tmpColor[loop-1].ToString(),tmpdatainfor[loop-1]+":"+tmpdata[loop-1].ToString());
            strPie+="<div id=/"colorInfo/">";
            strPie+= str_temp;
            strPie+="</div>";
            strPie+=strdivdatainfo;
            strPie+="</v:group>";
            strPie+="</v:group>";
        }
        public void showColorInfo(int i)
        {
            int top=colorInfoTop-300+i*373;
            string temp="<v:rect id='a"+i.ToString()+"' style='position:relative;left:2600;top:"+top.ToString()+";WIDTH:180;HEIGHT:180;' fillcolor='"+tmpColor[i]+"' strokecolor='black'><v:shadow on='t' type='single' color='silver' offset='2pt,2pt'></v:shadow></v:rect>";
            str_temp=temp+str_temp;
        }
        public void showDataInfo(int i)
        {
            int top = dataInfoTop-10 + i*11;
            string nInfo="<Div align='left' style='font-size:9pt;position:relative;top:"+top+";left:420'>"+tmpdatainfor[i]+"</Div>";
            strdivdatainfo+= nInfo;
        }
        public void createPie(double sa,double ea,string color,string n)
        {
            double fs=Convert.ToDouble(Math.PI*2*sa);
            double fe=Convert.ToDouble(Math.PI*2*ea);
            int sx=Convert.ToInt32(r*Math.Cos(fs));
            int sy=Convert.ToInt32(-r*Math.Sin(fs));
            int ex=Convert.ToInt32(r*Math.Cos(fe));
            int ey=Convert.ToInt32(-r*Math.Sin(fe));
            int index;
            if (sa<=0.3)
            {
                index = 100 - Convert.ToInt32((sa * 100));
                strPie+="<v:shape onclick='JavaScript:alert(/""+n+"/")' title='"+n+"' style='position:relative;left:-800;top:-1000;z-index:"+index.ToString()+";width:7000;height:6000'  fillcolor='"+color+"' path='m 0,0 l "+sx+","+sy+" ar -2000,-2000,2000,2000,"+sx+","+sy+","+ex+","+ey+","+" l 0,0 x e'>                                <v:Extrusion on='t' foredepth='0' backdepth='20pt' rotationangle='66,0' color='"+color+"'></v:Extrusion></v:shape>";
               
            }
            else if (sa>=0.75)
            {       
                    index = (100 - Convert.ToInt32((sa * 100)))+100;
                    strPie+="<v:shape onclick='JavaScript:alert(/""+n+"/")' title='"+n+"' style='position:relative;left:-800;top:-1000;z-index:"+index.ToString()+";width:7000;height:6000' fillcolor='"+color+"' path='m 0,0 l "+sx+","+sy+" ar -2000,-2000,2000,2000,"+sx+","+sy+","+ex+","+ey+","+" l 0,0 x e'>                                <v:Extrusion on='t' foredepth='0' backdepth='20pt' rotationangle='66,0' color='"+color+"'></v:Extrusion></v:shape>";
            }
            else
            {
                    strPie+="<v:shape onclick='JavaScript:alert(/""+n+"/")' title='"+n+"' style='position:relative;left:-800;top:-1000;z-index:100;width:7000;height:6000' fillcolor='"+color+"' path='m 0,0 l "+sx+","+sy+" ar -2000,-2000,2000,2000,"+sx+","+sy+","+ex+","+ey+","+" l 0,0 x e'>                                <v:Extrusion on='t' foredepth='0' backdepth='20pt' rotationangle='66,0' color='"+color+"'></v:Extrusion></v:shape>";
   
            }
        }
        #endregion
    }
}
//使用例子
private void Page_Load(object sender, System.EventArgs e)
        {
            Chat1.Max=13;
           
            Chat1.Data="12.5,25,19.5,17.5,12.5,16,9,21,3,7,8,6.2,9";
           
            Chat1.DataInfor="杨浦区,闸北区,普陀区,虹口区,宝山区,嘉定区,黄浦区,闵行区,浦东区,静安,徐汇区,其他区,其他区";
           
            Chat1.Color="red,#FFEBCD,#FFFF55,#00BFFF,#E6E6FA,#7B68EE,#FFCC33,#FFC0CB,#008B8B,#c27f34,#FFDEAD,#00FA9A,#D3D3D3";
           
        }
//保证程序运行正常请按下面做


<HTML xmlns:v="urn:schemas-microsoft-com:vml">
    <HEAD>
        <title>WebForm2</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">
        <STYLE> v/:* { BEHAVIOR: url(#default#VML) } </STYLE>
    </HEAD>
    <body MS_POSITIONING="GridLayout">
        <form id="Form1" method="post" runat="server">
            <cc1:ChartVolumeReport id="Chat1" runat="server"></cc1:ChartVolumeReport>
        </form>
    </body>
</HTML>

c# 通过.net自带的chart控件绘制饼图pie chart

需要实现的目标是: 1.将数据绑定到pie的后台数据中,自动生成饼图。 2.生成的饼图有详细文字的说明。 具体的实现步骤: >>前台界面的设置: 1.设置chart1的属...
  • mobingdetong
  • mobingdetong
  • 2014年04月02日 10:26
  • 808

自定义控件(一) 一个比例饼状图

前言:看了很多鸿洋的文章,感觉受益匪浅,正巧 今天在android聊天群里看到有这个需求,发现和鸿洋的这篇博客(http://blog.csdn.net/lmj623565791/article/de...
  • u012214750
  • u012214750
  • 2016年07月08日 13:15
  • 443

Android自定义控件:饼状图

Android自定义控件:饼状图
  • u013155862
  • u013155862
  • 2017年01月09日 11:23
  • 1266

WinForm Chart控件使用记录(由于制作饼装,柱状,折线图)

由于公司的winform项目需要用到Chart图表,抽空研究了一下,特地发上来给大家做个参考,就目前而言用到的属性说明都做了注释;主要用到Chart控件图表区域的属性有五个属性 Annotation...
  • c331043
  • c331043
  • 2016年08月06日 23:49
  • 4193

利用Excel制作问卷的饼状图

在调研过程中,调研方法有多种:问卷法,访谈法等,而当我们采用问卷法的时候,需要进行统计数据,当然如果选择例如问卷星等网上问卷的话,可以省去自己制作数据饼状图或条形图等麻烦,但因为一些原因,必须使用纸质...
  • u012336923
  • u012336923
  • 2014年09月16日 15:58
  • 2065

EXT Java 后台获取数据生成饼状图

Ext 做成各种图形是一个很好使的工具,以前没有接触过,现在因为工作,需要用他来做各种图。看过官方的demo和网上各位达人提供的例子,数据来源都是固定数据, 现在根据我的经验来分享下我从后台获取数据的...
  • cq_china
  • cq_china
  • 2015年12月31日 09:37
  • 1338

自定义控件View(三)___绘制饼状图

效果图如下:分析: 计算绘制的每个区域所占比例: drawArc 计算每个区域角平分线中点的坐标值 测量文字的宽度和高度,来确定文字开始绘制的位置,即BaseLine的位置 自定义PipeChartV...
  • showdy
  • showdy
  • 2016年02月26日 17:07
  • 824

ArcGIS教程:如何创建饼图

饼图由一个被分割成两个或更多扇区(分块或楔形)的圆形(饼)组成。饼图强调数据与整体之间的相对关系,在展现比例和比率方面特别有用。当数据由几个较大的类别(3 到 7 个类别)组成时,饼图的使用效率最高;...
  • u010687924
  • u010687924
  • 2014年06月12日 13:35
  • 1348

在地图上画饼图(ol3)

1、数据加载 var f={     "geometry": {         "type": "Point",         "coordinates":  ol.proj.transf...
  • djskl
  • djskl
  • 2014年07月31日 11:06
  • 1078

C#中wpf使用Devexpress画图:柱状图,饼状图,散点图,曲线图

C#中wpf使用Devexpress画图:柱状图,饼状图,散点图,曲线图1.效果 完整代码下载: 下图是随便生成的数据测试效果: C#中wpf使用Devexpress画图 2.部分设置可以从控...
  • yhhyhhyhhyhh
  • yhhyhhyhhyhh
  • 2016年12月25日 11:29
  • 2340
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用c#做的控件—用vml生成饼图
举报原因:
原因补充:

(最多只允许输入30个字)