c#做的控件—用vml生成柱状图
来源:互联网 发布:达特茅斯学院知乎 编辑:程序博客网 时间:2024/06/10 19:58
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>
/// ChartVolumeReport 的摘要说明。
/// </summary>
[DefaultProperty("Text"),
ToolboxData("<{0}:ChartVolumeReport runat=server></{0}:ChartVolumeReport>")]
public class ChartVolumeReport:Control
{
int bx = 1000;
int by = 4700;//坐标的最低处
int yh = 80;//垂直阴影高度
int xw = 80;//水平阴影宽度
int count=0;
double step;
double max;
double min;
int deci = 2;
double ystep;
string str_Volume=string.Empty;
string str_Group3=string.Empty;
string str_TempA=string.Empty;
string str_info=string.Empty;
string str_dinfo=string.Empty;
string temp=string.Empty;
private string data;
private string dataInfor;
private string colorArr;
private string[] Color;
string[] tmpdata;//传的数值
string[] tmpdatainfor;//传的对应内容
#region 属性
[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 ColorArr
{
get
{
return colorArr;
}
set
{
colorArr=value;
}
}
#endregion
public ChartVolumeReport()
{
str_Volume+="<v:group ID=/"group2/" style=/"WIDTH:480px;POSITION:relative;HEIGHT:270px/" coordsize=/"7200,4050/">";
str_Volume+="<v:rect style=/"WIDTH:9600px;HEIGHT:5400px/" fillcolor=/"white/" strokecolor=/"black/" coordsize=/"21600,21600/">";
str_Volume+="<v:shadow on=/"t/" type=/"single/" color=/"silver/" offset=/"4pt,3pt/"></v:shadow>";
str_Volume+="</v:rect>";
str_Group3+="<v:group ID=/"group3/" style=/"DISPLAY:block;WIDTH:9600px;POSITION:relative;HEIGHT:5400px/" coordsize=/"9600,5400/">";
str_Group3+="<v:line from=/"1000,500/" to=/"1000,4900/" style=/"Z-INDEX:1;POSITION:absolute/" strokeweight=/"1pt/">";
str_Group3+="<v:stroke StartArrow=/"classic/" />";
str_Group3+="</v:line>";
str_Group3+="<v:polyLine filled=/"t/" fillcolor=/"#adaead/" strokecolor=/"#adaead/" strokeweight=/"1pt/" points=/"1000,700,1100,620,1100,4620,1000,4700,1000,700/"></v:polyLine>";
str_Group3+="<v:polyLine filled=/"t/" fillcolor=/"#d6d7d6/" strokecolor=/"#d6d7d6/" strokeweight=/"1pt/" points=/"1000,4700,1100,4620,9100,4620,9000,4700,1000,4700/"></v:polyLine>";
str_Group3+="<v:polyLine filled=/"t/" fillcolor=/"#efefef/" strokecolor=/"#efefef/" strokeweight=/"1pt/" points=/"1000,4700,9000,4700,9000,4900,1000,4900,1000,4700/"></v:polyLine>";
str_Group3+="<v:polyLine filled=/"t/" fillcolor=/"#fc0/" strokecolor=/"#fc0/" strokeweight=/"1pt/" points=/"9000,4700,9100,4620,9100,4820,9000,4900,9000,4700/"></v:polyLine>";
str_info="<div id=/"info/">";
str_dinfo="<div id=/"dinfo/">";
}
protected override void Render(HtmlTextWriter output)
{
Color=colorArr.Split(new char[]{','});
tmpdata=data.Split(new char[]{','});//传的数值
tmpdatainfor=dataInfor.Split(new char[]{','});//传的对应内容
count=tmpdata.Length;
step= 8000/count;
max=Convert.ToDouble(tmpdata[0]);
min=Convert.ToDouble(tmpdata[0]);
for(int i=0;i<tmpdata.Length;i++)
{
if(Convert.ToDouble(tmpdata[i])/1>max)
max=Convert.ToDouble(tmpdata[i]);
if(Convert.ToDouble(tmpdata[i])/1<min)
min=Convert.ToDouble(tmpdata[i]);
}
ystep=4000/max;
drawColumn();
this.Page.Response.Write(str_Volume);
}
private void drawColumn()
{
//画竖直背景
for(int i=0;i<tmpdata.Length;i++)
{
if(i%2 != 0)
{
temp="<v:PolyLine filled=t fillcolor='#F7F7F7' strokecolor='#F7F7F7' strokeweight=1pt points='"+(bx+i*step+xw)+","+(by-yh-10)+" "+(bx+i*step+xw)+",500 "+(bx+(i/1+1)*step+xw)+",500 "+(bx+(i/1+1)*step+xw)+","+(by-yh-10)+" "+(bx+i*step+xw)+","+(by-yh-10)+"'/>";
str_TempA=temp+"<v:PolyLine filled=t fillcolor='#dedfde' strokecolor='#dedfde' strokeweight=1pt points='"+(bx+i*step)+","+by+" "+(bx+(i/1+1)*step)+","+by+" "+(bx+(i/1+1)*step)+","+(by+200)+" "+(bx+i*step)+","+(by+200)+" "+(bx+i*step)+","+by+"'/>"+str_TempA;
}
}
//str_Volume+=str_TempA;
//画水平横线和Y侧横线
string lineColor="";
for(int i=1;i<11;i++)
{
double ynum;
if (deci >0 )
{
ynum = Math.Round(Math.Pow(10,deci)*i*max*0.1)*Math.Pow(10,deci+1)/(Math.Pow(10,deci+deci+1));
}
else
{
ynum = Math.Round(i*max*0.1);
}
if(i%3==0)
lineColor="#B5E3B5";
else
lineColor="#E7E3E7";
temp="<v:Line title="+ynum+" strokecolor='"+lineColor+"' strokeweight=1pt from='"+(bx+xw)+","+(by-i*400-yh)+"' to='"+9100+","+(by-i*400-yh)+"'/>";
str_TempA=str_TempA+temp;;
temp="<v:Line title="+ynum+" strokecolor='#E7E3E7' strokeweight=1pt from='"+bx+","+(by-i*400)+"' to='"+(bx+xw)+","+(by-i*400-yh)+"'/>";
str_TempA=str_TempA+temp;
temp="<v:Line title="+ynum+" strokecolor='#000000' strokeweight=1pt from='"+bx+","+(by-i*400)+"' to='"+(bx-100)+","+(by-i*400)+"'/>";
str_TempA=str_TempA+temp;
double top = 0 + i*12.5;
if (deci>0)
{
ynum = Math.Round(Math.Pow(10,deci)*(11-i)*max*0.1)*Math.Pow(10,deci+1)/(Math.Pow(10,deci+deci+1));
}
else
{
ynum = Math.Round((11-i)*max*0.1);
}
string nInfo="<Div align='right' style='font-size:9pt;position:relative;top:"+top+";left:-555'>"+ynum+"</Div>";
str_dinfo+= nInfo;
}
//画X侧横线画柱状图
string infostr="<TABLE cellspacing='0' cellpadding='0' border=0 style='POSITION:absolute;LEFT:6px;TOP:299px;width:535px;'><TR>";
for(int i=0;i<tmpdata.Length;i++)
{
infostr+="<TD width='"+100/tmpdata.Length+"%' align='center'><FONT SIZE=2>"+tmpdatainfor[i].ToString()+"</FONT></TD>";
if(Convert.ToDouble(tmpdata[i])/1 != 0)
createColumn(i);
}
infostr+="</TR></TABLE>";
str_info=infostr;
//完成,综合语句
str_Volume+=str_TempA;
str_Volume+=str_Group3;
str_Volume+=str_info;
str_Volume+="</div>";
str_Volume+=str_dinfo;
str_Volume+="</div>";
str_Volume+="</v:group></v:group>";
}
private void createColumn(int index)
{
double sx=bx+index*step/1+step/4;
double h=Convert.ToDouble(tmpdata[index])*ystep;
double sy=4700-h;
string showMsg=tmpdatainfor[index]+":"+tmpdata[index];
str_Group3+="<v:polyLine onclick='JavaScript:alert(/""+showMsg+"/")' title='"+showMsg+"' style='z-index:9' filled=t fillcolor='"+Color[index]+"' strokecolor='"+Color[index]+"' strokeweight=1pt points='"+sx+","+by+" "+sx+","+sy+" "+(sx+step/2)+","+sy+" "+(sx+step/2)+","+by+" "+sx+","+by+"'>" + "<v:Extrusion on='t' foredepth='0' backdepth='15pt' color='"+Color[index]+"' rotationangle='0,0'></v:Extrusion></v:polyLine>";
}
}
}
//下面是使用的例子
private void Page_Load(object sender, System.EventArgs e)
{
Chat1.Data="12.5,25,19.5,17.5,12.5,16,9,21,3,7,8,6.2,9";
Chat1.DataInfor="杨浦区,闸北区,普陀区,虹口区,宝山区,嘉定区,黄浦区,闵行区,浦东区,静安,徐汇区,其他区,其他区";
Chat1.ColorArr="#ff2222,#d0b83a,#ffdf00,green,#ff9e00,#799AE1,#99c741,#d0b83a,#319a00,#c27f34,#2222ff,#ff2222,#99c741";
}
//保证程序运行正常请按下面做
下面是使用的时候,html代码中需要加入的,注意< html >标记处,和< Style >标记处。
<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#做的控件—用vml生成柱状图
- 用c#做的控件—用vml生成饼图
- 用c#做的控件—用vml生成饼图
- JavaScript+vml动态生成柱状图
- 不用任何控件的VML统计图(2)-柱状图
- 最近做的asp.net+VML控件
- VML/ASP生成柱状图、曲线图、饼状图
- 用asp+vml实现的立体统计图(一)-----柱状图
- VML-柱状图
- dojo所做的柱状图控件类
- C# 做柱状图
- vml 的饼图柱状图和线图
- vml+javascript动态生成柱状图、饼图、折线图
- VML画柱状图、并图、折线图的封装
- 关于ASP用vml动态生成直方图的完整示例
- 用C#做ActiveX控件
- 纯js做的柱状图
- C#生成柱状图,包括刻度,刻度值.
- ASP.NET四种页面导航方式的比较与选择
- ASP.NET虚拟主机存在的重大隐患
- blueline的blog
- Java 理论与实践: 关于异常的争论
- ASP.NET中网页的加载时间
- c#做的控件—用vml生成柱状图
- 写在飞雪如絮时
- DataGrid超级链接列中绑定一个以上字段
- 用.NET获取汉字的区位码(c#)
- Servlet/JSP服务器端的重定向
- Web Server程序编写学习笔记(二)
- pl/x 语言语法分析器的java实现
- 光标的修改
- xml完成配置的功能