当前位置: 首页 > 编程日记 > 正文

一个饼形图形报表

最近在做一个统计投票数量的图形报表,主要借鉴了一个51aspx中的一个例子,因为要在一页中显示多个图形,所以选择了在pannel中动态添加Image控件.效果图如下:

 
/// <summary>
        /// 饼形图形报表
        /// </summary>
        /// <param name="target">Stream对象的实例</param>
        /// <param name="p_dt">数据源</param>
        /// <param name="p_strTitle">大标题</param>
        /// <param name="p_strText">小标题字段</param>
        /// <param name="p_strCount">统计数量字段</param>
        public void DrawPic(Stream target,DataTable p_dt,string p_strTitle,string p_strText,string p_strCount)
        {
            //DataTable m_dt = QVoteService.Instance().GetVoteCount(p_strFID);
            float[] angle = new float[p_dt.Rows.Count];
            string[] sTxt = new string[p_dt.Rows.Count];
            float AllCount = 0;

for (int i = 0; i < p_dt.Rows.Count; i++)
            {
                DataRow m_dr = p_dt.Rows[i];
                AllCount += Convert.ToSingle(m_dr[p_strCount].ToString());

}
            //计算选项在总体中所占的比例
            for (int i = 0; i < p_dt.Rows.Count; i++)
            {
                DataRow m_dr = p_dt.Rows[i];
                if (AllCount != 0)
                {
                    angle[i] = Convert.ToSingle(m_dr[p_strCount].ToString()) * 360.0f / AllCount;
                    sTxt[i] = m_dr[p_strText].ToString() + " " + (Math.Round(Convert.ToSingle(m_dr[p_strCount].ToString()) / AllCount, 2)) * 100 + "%";
                }
                else
                {
                    angle[i] = Convert.ToSingle(1 * 360.0f / p_dt.Rows.Count);
                    sTxt[i] = m_dr[p_strText].ToString() + " " + (Convert.ToSingle(1 / p_dt.Rows.Count)) * 100 + "%";
                }
            }


            float x = 75.0f, y = 65.0f, d = 100.0f, offset = 15.0f, x1 = 0.0f, y1 = 0.0f;//圆形x,y坐标,半径,偏移距离,x,y方向的偏移值
            float curangle = 0.0f;//当前已转的角度

int ox = 100, oy =100;//圆心坐标
            int px1 = 0, py1 = 0, px2 = 0, py2 = 0;//直线的端点

System.Drawing.Image bitmap = new Bitmap(385, 200, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);//建立了一个BitMap对象,它为要创建的图形提供了内存空间
            Graphics g = Graphics.FromImage(bitmap);//产生一个Graphics对象,它封装了GDI+画图接口

g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

//20项颜色。
            Color[] color = new Color[]{Color.PapayaWhip,Color.Red,Color.Salmon,Color.Thistle,Color.Blue,Color.Coral,Color.DarkGoldenrod,Color.Black,Color.Firebrick,Color.Gold,Color.Honeydew,Color.Indigo,Color.Khaki,Color.LemonChiffon,Color.Maroon,Color.Navy,
                                         Color.Orange,Color.Violet,Color.Wheat,Color.YellowGreen};

g.Clear(Color.FromArgb(227, 240,255));//清屏

StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;

g.DrawString(p_strTitle, new Font(FontFamily.GenericSansSerif,8), new SolidBrush(Color.Black), new RectangleF(0.0f, 10.0f, 420.0f, 20.0f), sf);//标题

//画右侧的大矩形
            g.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), 457, 105, 150, (angle.Length + 1) * 12);//阴影
            g.FillRectangle(new SolidBrush(Color.FromArgb(253, 245, 230)), 455, 105, 150, (angle.Length + 1) * 12);//前景
            g.DrawRectangle(new Pen(Color.FromArgb(128, 128, 128), 1), 455, 105, 150, (angle.Length + 1) * 12);//轮廓
            /**/
            /

for (int i = 0; i < angle.Length; i++)
            {
                sf.Alignment = StringAlignment.Near;

ox = Convert.ToInt32(x + d / 2);
                oy = Convert.ToInt32(y + d / 2);

px1 = Convert.ToInt32((d / 2 + 20) * Math.Cos((curangle + angle[i] / 2) * Math.PI / 180.0f)) + ox;
                py2 = py1 = Convert.ToInt32((d / 2 + 20) * Math.Sin((curangle + angle[i] / 2) * Math.PI / 180.0f)) + oy;

if ((curangle + angle[i] / 2) >= 270 || (curangle + angle[i] / 2) < 90) px2 = px1 + 10;
                else px2 = px1 - 10;


                //g.DrawLine(new Pen(Color.FromArgb(120, 120, 120), 1), new Point(ox, oy), new Point(px1, py1));//画直线-标释用。
                //g.DrawLine(new Pen(Color.FromArgb(120, 120, 120), 1), new Point(px1, py1), new Point(px2, py2));//直线

//if ((curangle + angle[i] / 2) >= 270 || (curangle + angle[i] / 2) < 90)
                //{

//    g.DrawString(sTxt[i], new Font(FontFamily.GenericSansSerif, 8), new SolidBrush(Color.FromArgb(120, 120, 120)), px2, py2 - 4, sf);
                //}
                //else
                //{

//    g.DrawString(sTxt[i], new Font(FontFamily.GenericSansSerif, 8), new SolidBrush(Color.FromArgb(120, 120, 120)), px2 - sTxt[i].Length * 12 - 2, py2 - 4, sf);
                //}

g.FillPie(new SolidBrush(Color.FromArgb(128, 128, 128)), x + 2, y + 2, d, d, curangle, angle[i]);
                g.FillPie(new SolidBrush(color[i]), x, y, d, d, curangle, angle[i]);

g.DrawPie(new Pen(Color.FromArgb(128, 128, 128),0), x, y, d, d, curangle, angle[i]);
                curangle += angle[i];

//画右侧的小矩形,与文字
                g.FillRectangle(new SolidBrush(Color.FromArgb(128, 128, 128)), 427, i * 14 + 6 + 58 + 2, 20, 10);//阴影
                g.FillRectangle(new SolidBrush(color[i]), 207, i * 14 + 6 + 60, 20, 10);//前景
                g.DrawRectangle(new Pen(Color.FromArgb(120, 120, 120), 1),207, i * 14 + 6 + 60, 20, 10);//轮廓
                g.DrawString(sTxt[i], new Font(FontFamily.GenericSansSerif,8), new SolidBrush(Color.FromArgb(80, 80, 80)), 227, i * 14 + 6 +60, sf);
            }
            bitmap.Save(target, ImageFormat.Gif);
            bitmap.Dispose();
            g.Dispose();
        }
///pannel中动态添加
 DataTable m_dt = 数据源
            for (int i = 0; i < m_dt.Rows.Count;i++ )
            {
                Image m_img = new Image();
                m_img.Style.Add("margin-top", "5px");
                m_img.Style.Add("float","left");
                m_img.Style.Add("margin-left","5px");
                m_img.ImageUrl = "GraphicStatements.aspx?FID=" + m_dt.Rows[i]["FID"].ToString()+"&&FTitle="+Server.UrlEncode(m_dt.Rows[i]["FTitle"].ToString());
                Panel1.Controls.Add(m_img);
            }

转载于:https://www.cnblogs.com/SoulStore/archive/2007/08/13/854060.html

相关文章:

(C++)从字符串中取出整形、浮点型和字符串

目的&#xff1a;从字符串"330:20.20:yoyo"中取出整数330&#xff0c;浮点数20.20和字符串"yoyo" #include<cstdio> #include<cstring>int main(){char str[50]"330:20.20:yoyo";int n;double g;char sstr[40];sscanf(str,"%d…

[C#]网络编程系列专题二:HTTP协议详解

转自&#xff1a;http://www.cnblogs.com/zhili/archive/2012/08/18/2634475.html 我们在用Asp.net技术开发Web应用程序后&#xff0c;当用户在浏览器输入一个网址时就是再向服务器发送一个HTTP请求&#xff0c;此时就使用了应用层的HTTP协议&#xff0c;在上一个专题我们简单介…

Python3 与 C# 并发编程之~ Net篇

NetCore并发编程 示例代码&#xff1a;https://github.com/lotapp/BaseCode/tree/master/netcore/4_Concurrency 先简单说下概念&#xff08;其实之前也有说&#xff0c;所以简说下&#xff09;&#xff1a; 并发&#xff1a;同时做多件事情多线程&#xff1a;并发的一种形式并…

tomcat5.5.9+sql2000数据库连接池配置

终于解决了困扰多天的连接池的问题&#xff0c;写下这编文章与大家一起分享。我是在tomcat5.5.9下配置的&#xff0c;tomcat5.5.X和以前的版本有一些差别&#xff0c;所以配置上也有差别。我就说一下在tomcat5.5.9配置的基本步骤&#xff1a;&#xff08;确定你以安装好tomcat5…

(C++)第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。

题目描述 有一行电文&#xff0c;已按如下规律译成密码&#xff1a; A–>Z a–>z B–>Y b–>y C–>X c–>x … … 即第一个字母变成第26个字母&#xff0c;第i个字母变成第&#xff08;26-i1)个字母&#xff0c;非字母字符不变。要求根据密码译回原文&a…

mysql++读写BLOB数据

mysql读写BLOB数据 1、使用sql_create_n宏函数&#xff0c;建立数据库表字段与对象。 #define sql_create_2(NAME, CMP, CONTR, T1, I1, T2, I2) \ sql_create_complete_2(NAME, CMP, CONTR, T1, I1, #I1, T2, I2, #I2) \ //NAME&#xff1a;表名&#xff1…

oracle RAC的VIP和scan

我们都知道Oracle RAC中每个节点都有一个虚拟IP&#xff0c;简称VIP&#xff0c;与公网IP在同一个网段。 没有VIP时&#xff0c;Oracle客户端是靠“TCP/IP协议栈超时”来判断服务器故障。而TCP/IP协议栈是作为OS Kernel的一部分来实现&#xff0c;不同的OS有不同的阀值&#xf…

2007年你必须学习的10项.NET技术

1、WCF (Windows Communication Foundation):虽然WCF显然没有WPF或SilverLight那么吸引人,但是它却是在.NET框架下解决业务问题的基础。所以你今年至少要学习一门.NET的新技术,那你就选择WCF吧。 2、ADO.NET (and LINQ):这是让你与数据层打交道的技术。并且LINQ提供了将各种数据…

(C++)用指针实现两数交换函数swap()的两种方法

#include<cstdio>//用指针写swap()函数 void swap_1(int* p1,int* p2){int temp *p1;*p1 *p2;*p2 temp; } //用指针和指针的引用写swap()函数 void swap_2(int* &p1,int* &p2){int* temp p1;p1 p2;p2 temp; } int main(){int a 2020,b2021;int *p1&a,…

【转】《iOS7 by Tutorials》系列:iOS7的设计精髓(上)

简介&#xff1a; 本文翻译自《iOS7 by Tutorials》一书的第一章“Designing for iOS 7”&#xff0c;主要从程序员角度介绍了iOS7的新设计理念&#xff0c;堪称神作&#xff01;本文翻译仅作学习交流之用&#xff0c;版权归原作者所有&#xff0c;有删减。非专业翻译人士粗糙之…

有兴趣的执行一下这段代码

有兴趣的执行一下这段代码&#xff1a;staticpublicstringGetConfigiuageConnString() { Guid dataLinksGuid new Guid("2206cdb2-19c1-11d1-89e0-00c04fd7a829"); Type dataLinksType Type.GetTypeFromCLSID(dataLinksGuid, true); …

python爬虫知识点总结(二十三)Scrapy中Download Middleware的用法

待更新转载于:https://www.cnblogs.com/cthon/p/9424551.html

(C++)输入3个字符串,按从小到大的顺序输出。

#include<cstdio> #include<cstring> //1.利用指针编写两个字符串的比较函数 //2.利用二位字符数组接收3个字符串 //3.输出排序后的字符串 void s_to_b(char str1[10],char str2[10]){char temp[10];strcpy(temp,str1);strcpy(str1,str2);strcpy(str2,temp); }void…

Mysql备份还原数据库之mysqldump实例及参数详细说明

我们在运营项目的过程中肯定会遇到备份数据库&#xff0c;还原数据库的情况&#xff0c;我们一般用一下两种方式来处理&#xff1a; 1.使用into outfile 和 load data infile导入导出备份数据 这种方法的好处是&#xff0c;导出的数据可以自己规定格式&#xff0c;并且导出的是…

女性护理品牌Honeymate获8000万A+轮融资,将与美图公司深度合作

8月5日消息&#xff0c;女性护理品牌“美则Honeymate”于今年7月获美图公司8000万A轮战略融资&#xff0c;资金主要用于品牌扩张以及用户体系、会员体系的建立&#xff0c;也将与美图公司深度合作&#xff0c;为美图超5亿用户创造更多价值。 美则Honeymate&#xff08;深圳市护…

桌面图标不透明的小问题处理

"我的电脑"--"属性"--"高级"--"设置",将下框"在桌面上为图标标签使用阴影"打勾. 在"自定义桌面"里去除相应"桌面网页"项.通过如上两步一般就可以去除图标后面的方框背景, 早上一来遇到位同事问我桌面图…

<论文翻译>RepVGG: Making VGG-style ConvNets Great Again

RepVGG:让VGG风格的卷积网络再一次伟大 文章目录RepVGG:让VGG风格的卷积网络再一次伟大摘要1. Introduction2. Related Work2.1 从单路径到多分支2.2 有效的单路径模型的训练2.3 模型重新参数化2.4 温诺格勒(Winograd)卷积3. 通过结构性重新参数化构建RepVGG3.1 简单就是快&…

关于android布局的两个属性dither和tileMode,background 平铺

http://blog.csdn.net/yuxiaohui78/article/details/8196043转载于:https://www.cnblogs.com/leihupqrst/p/3711725.html

volatile - 如何实现线程安全

2019独角兽企业重金招聘Python工程师标准>>> volatile关键字&#xff0c;在我之前的博客 Volatile - 用途 中已经简单讲解过&#xff0c;当时提出了volatile在多线程中是不安全的。本文将重点介绍一种使用方式&#xff0c;可以实现线程安全。 首先&#xff0c;来看一…

【我翻译的文章】你还需要数据层吗?

随着LINQ的临近发布&#xff0c;独立数据访问层的必要性需要重新进行评估了。它是否仍是应用程序设计的一个重要部分&#xff1f;或者它是否会变成一个过去的附属物&#xff1f; 详细信息请访问&#xff1a;http://www.infoq.com/cn/news/2007/08/DAL转载于:https://www.cnblog…

正则表达式最常用的符号匹配

字符描述\d代表任意数字&#xff0c;就是阿拉伯数字 0-9 这些玩意。\D大写的就是和小写的唱反调&#xff0c;\d 你代表的是任意数字是吧&#xff1f;那么我 \D 就代表不是数字的。\w跟 \w 唱反调&#xff0c;代表不是字母&#xff0c;不是数字&#xff0c;不是下划线的。\n代表…

一道多线程编程题

有意思的一道多线程编程题请用多线程显示&#xff0c;每三个数字为一组&#xff0c;直到30线程A&#xff1a;1线程A&#xff1a;2线程A&#xff1a;3线程B&#xff1a;4线程B&#xff1a;5线程B&#xff1a;6线程A&#xff1a;7线程A&#xff1a;8线程A&#xff1a;9public cla…

垃圾回收机制:

2019独角兽企业重金招聘Python工程师标准>>> 垃圾回收机制&#xff1a; 1、GC通过确定对象是否被活动对象引用来确定是否收集该对象。 2、触发GC的条件 1)GC在优先级最低的线程中运行&#xff0c;一般在应用程序空闲即没有应用线程在运行时被调用。但下面的条件例外…

爬虫入门知识笔记

1.爬虫是什么 定义一&#xff1a; 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff09;就是模拟浏览器发送网络请求&#xff0c;接收请求响应&#xff0c;一种按照一定的规则&#xff0c;自动地抓取互联网信息的程序。原则上,只要是浏览器(客户端)能做的事…

SQL SERVER中什么情况会导致索引查找变成索引扫描

原文:SQL SERVER中什么情况会导致索引查找变成索引扫描SQL Server 中什么情况会导致其执行计划从索引查找&#xff08;Index Seek&#xff09;变成索引扫描&#xff08;Index Scan&#xff09;呢&#xff1f; 下面从几个方面结合上下文具体场景做了下测试、总结、归纳。 1&…

wait跟sleep的区别

区别 wait sleep 线程 自动唤醒 object的方法只要 线程碰到wait就要等 待不能指定哪个线程等待 Thread的方法 wait用于同步 在任何地方使用 自动释放锁 不会释放锁 转载于:https://www.cnblogs.com/-try/p/3714954.html

AMD真龙一族网络社区成立

AMD成立了一个网络社区&#xff0c;叫"真龙一族"&#xff0c;在各大厂商里这的确为一创新之举&#xff0c;看来AMD对自己的产品确实是非常的有信心。有打算买电脑的人可进去看看&#xff0c;参考一下。地址http://www.longamd.cn/default.htm转载于:https://www.cnbl…

<论文阅读>CascadePSP: Toward Class-Agnostic and Very High-Resolution Segmentation via Global and...

名词解释&#xff1a; 双三次插值&#xff1a;双三次插值是一种更加复杂的插值方式&#xff0c;它能创造出比双线性插值更平滑的图像边缘。 **标题翻译&#xff1a;**通过全局和局部优化进行面向不可知类和超高像素图像的分割 CascadePSP: Toward Class-Agnostic and Very Hig…

【转】MYSQL入门学习之十:视图的基本操作

转载地址&#xff1a;http://www.2cto.com/database/201212/176775.html 一、视图的基本介绍 www.2cto.com 视图是虚拟的表。与包含数据的表不一样&#xff0c;视图只包含使用时动态检索数据的查询。使用视图需要MySQL5及以后的版本支持。下面是视图的一些常见应用&#xff1…

自动化运维之SaltStack,批量安装httpd实战

SaltStack原理 SaltStack由Master和Minion构成&#xff0c;Master 是服务端&#xff0c; 表示一台服务器&#xff1b;Minion是客户服务端&#xff0c;表示多台服务器。在Master上发送命令给符合条件的Minion,Minin就会执行相应的命令&#xff0c;Master和Minion之间是通过ZeroM…