C#使用Chart进行统计,切换不同的图表类型

news2024/11/20 20:29:04

WindowsForm应用程序中Chart图表控件所属的命名空间:

Chart

命名空间:

System.Windows.Forms.DataVisualization.Charting

对应的dll路径:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Windows.Forms.DataVisualization.dll

示例:我们使用chart来统计某种产品的OK和NG个数。

每隔5秒钟自动刷新OK和NG数量,可以切换使用柱状图、环形、线性图、饼图等显示

新建windows窗体应用程序:

ChartDemo,将默认的Form1,重命名为FormChart,

窗体设计器源程序如下:

文件:FormChart.Designer.cs


namespace ChartDemo
{
    partial class FormChart
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows 窗体设计器生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要修改
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
            System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
            System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
            this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart();
            this.label1 = new System.Windows.Forms.Label();
            this.cboChartType = new System.Windows.Forms.ComboBox();
            this.label2 = new System.Windows.Forms.Label();
            this.label3 = new System.Windows.Forms.Label();
            this.label4 = new System.Windows.Forms.Label();
            this.lblOKCount = new System.Windows.Forms.Label();
            this.lblNGCount = new System.Windows.Forms.Label();
            this.lblTotalCount = new System.Windows.Forms.Label();
            ((System.ComponentModel.ISupportInitialize)(this.chart1)).BeginInit();
            this.SuspendLayout();
            // 
            // chart1
            // 
            chartArea1.Name = "ChartArea1";
            this.chart1.ChartAreas.Add(chartArea1);
            legend1.Name = "Legend1";
            this.chart1.Legends.Add(legend1);
            this.chart1.Location = new System.Drawing.Point(22, 68);
            this.chart1.Name = "chart1";
            series1.ChartArea = "ChartArea1";
            series1.Legend = "Legend1";
            series1.Name = "产量";
            this.chart1.Series.Add(series1);
            this.chart1.Size = new System.Drawing.Size(652, 559);
            this.chart1.TabIndex = 0;
            this.chart1.Text = "chart1";
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Font = new System.Drawing.Font("宋体", 16F);
            this.label1.Location = new System.Drawing.Point(19, 21);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(98, 22);
            this.label1.TabIndex = 1;
            this.label1.Text = "图表类型";
            // 
            // cboChartType
            // 
            this.cboChartType.Font = new System.Drawing.Font("宋体", 16F);
            this.cboChartType.FormattingEnabled = true;
            this.cboChartType.Location = new System.Drawing.Point(123, 18);
            this.cboChartType.Name = "cboChartType";
            this.cboChartType.Size = new System.Drawing.Size(214, 29);
            this.cboChartType.TabIndex = 2;
            this.cboChartType.SelectedIndexChanged += new System.EventHandler(this.cboChartType_SelectedIndexChanged);
            // 
            // label2
            // 
            this.label2.AutoSize = true;
            this.label2.Font = new System.Drawing.Font("宋体", 16F);
            this.label2.Location = new System.Drawing.Point(93, 640);
            this.label2.Name = "label2";
            this.label2.Size = new System.Drawing.Size(43, 22);
            this.label2.TabIndex = 3;
            this.label2.Text = "OK:";
            // 
            // label3
            // 
            this.label3.AutoSize = true;
            this.label3.Font = new System.Drawing.Font("宋体", 16F);
            this.label3.Location = new System.Drawing.Point(93, 670);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(43, 22);
            this.label3.TabIndex = 4;
            this.label3.Text = "NG:";
            // 
            // label4
            // 
            this.label4.AutoSize = true;
            this.label4.Font = new System.Drawing.Font("宋体", 16F);
            this.label4.Location = new System.Drawing.Point(60, 700);
            this.label4.Name = "label4";
            this.label4.Size = new System.Drawing.Size(76, 22);
            this.label4.TabIndex = 5;
            this.label4.Text = "Total:";
            // 
            // lblOKCount
            // 
            this.lblOKCount.AutoSize = true;
            this.lblOKCount.Font = new System.Drawing.Font("宋体", 16F);
            this.lblOKCount.Location = new System.Drawing.Point(144, 640);
            this.lblOKCount.Name = "lblOKCount";
            this.lblOKCount.Size = new System.Drawing.Size(21, 22);
            this.lblOKCount.TabIndex = 6;
            this.lblOKCount.Text = "0";
            // 
            // lblNGCount
            // 
            this.lblNGCount.AutoSize = true;
            this.lblNGCount.Font = new System.Drawing.Font("宋体", 16F);
            this.lblNGCount.Location = new System.Drawing.Point(144, 670);
            this.lblNGCount.Name = "lblNGCount";
            this.lblNGCount.Size = new System.Drawing.Size(21, 22);
            this.lblNGCount.TabIndex = 7;
            this.lblNGCount.Text = "0";
            // 
            // lblTotalCount
            // 
            this.lblTotalCount.AutoSize = true;
            this.lblTotalCount.Font = new System.Drawing.Font("宋体", 16F);
            this.lblTotalCount.Location = new System.Drawing.Point(144, 700);
            this.lblTotalCount.Name = "lblTotalCount";
            this.lblTotalCount.Size = new System.Drawing.Size(21, 22);
            this.lblTotalCount.TabIndex = 8;
            this.lblTotalCount.Text = "0";
            // 
            // FormChart
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(862, 747);
            this.Controls.Add(this.lblTotalCount);
            this.Controls.Add(this.lblNGCount);
            this.Controls.Add(this.lblOKCount);
            this.Controls.Add(this.label4);
            this.Controls.Add(this.label3);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.cboChartType);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.chart1);
            this.Name = "FormChart";
            this.Text = "图表示例:切换图表类型";
            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormChart_FormClosing);
            this.Load += new System.EventHandler(this.FormChart_Load);
            ((System.ComponentModel.ISupportInitialize)(this.chart1)).EndInit();
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.DataVisualization.Charting.Chart chart1;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.ComboBox cboChartType;
        private System.Windows.Forms.Label label2;
        private System.Windows.Forms.Label label3;
        private System.Windows.Forms.Label label4;
        private System.Windows.Forms.Label lblOKCount;
        private System.Windows.Forms.Label lblNGCount;
        private System.Windows.Forms.Label lblTotalCount;
    }
}

FormChart.代码如下:

文件:FormChart.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ChartDemo
{
    public partial class FormChart : Form
    {
        /// <summary>
        /// 是否运行线程
        /// </summary>
        public static bool isRun = false;
        public FormChart()
        {
            InitializeComponent();
            //添加不同的图表枚举
            cboChartType.Items.AddRange(new object[] {
            "Spline",
            "Pie",
            "Column",
            "Doughnut"});
            cboChartType.SelectedIndex = 3;
        }

        /// <summary>
        /// 切换图表类型
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cboChartType_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboChartType.SelectedIndex == -1)
            {
                return;
            }
            System.Windows.Forms.DataVisualization.Charting.SeriesChartType chartType;
            Enum.TryParse(cboChartType.Text, true, out chartType);
            chart1.Series[0].ChartType = chartType;
        }

        private void FormChart_Load(object sender, EventArgs e)
        {
            isRun = true;
            Task.Factory.StartNew(() =>
            {
                while (isRun)
                {
                    Tuple<int, int, int> tuple = GetProductCount();
                    RefreshChart(tuple);
                    Thread.Sleep(5000);
                }
            });
        }

        /// <summary>
        /// 返回指定时间区间的OK数量、NG数量、总数量
        /// </summary>
        /// <returns></returns>
        private Tuple<int, int, int> GetProductCount()
        {
            int okCount = 0;
            int ngCount = 0;
            okCount = new Random().Next(1000, 10000);
            ngCount = new Random(Guid.NewGuid().GetHashCode()).Next(1000, 10000);
            return Tuple.Create(okCount, ngCount, okCount + ngCount);
        }

        /// <summary>
        /// 刷新图表
        /// </summary>
        /// <param name="tuple"></param>
        void RefreshChart(Tuple<int, int, int> tuple)
        {
            List<Tuple<string, int>> dataList = new List<Tuple<string, int>>
            {
                Tuple.Create("OK", tuple.Item1),
                Tuple.Create("NG", tuple.Item2),
            };
            this.BeginInvoke(new Action(() =>
            {
                try
                {
                    if (!this.IsHandleCreated)
                    {
                        return;
                    }
                    lblOKCount.Text = tuple.Item1.ToString();
                    lblNGCount.Text = tuple.Item2.ToString();
                    lblTotalCount.Text = tuple.Item3.ToString();
                    chart1.Series[0].Points.Clear();
                    for (int i = 0; i < dataList.Count; i++)
                    {
                        //chart的X轴为索引,Y轴为实际值
                        chart1.Series[0].Points.AddXY(dataList[i].Item1, dataList[i].Item2);
                    }
                    chart1.ChartAreas[0].AxisX.MajorGrid.Enabled = false;//隐藏X网格线
                    chart1.ChartAreas[0].AxisY.MajorGrid.Enabled = false;//隐藏Y网格线
                    chart1.Series[0].IsValueShownAsLabel = true; //显示Y轴的具体值
                    //传入相等数量的集合:甜甜圈
                    System.Windows.Forms.DataVisualization.Charting.SeriesChartType chartType;
                    Enum.TryParse(cboChartType.Text, true, out chartType);
                    chart1.Series[0].ChartType = chartType;
                    //chart1.Series[0].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Doughnut;
                    chart1.Series[0].Points[0].Color = Color.ForestGreen;//第一个柱状图OK显示绿色
                    chart1.Series[0].Points[1].Color = Color.Red;//第二个柱状图NG显示红色
                    chart1.Series[0].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"RefreshChart Occur Exception:{ex.Message}");
                }
            }));
        }

        /// <summary>
        /// 窗体正在关闭事件,关闭线程
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormChart_FormClosing(object sender, FormClosingEventArgs e)
        {
            isRun = false;
        }
    }
}

运行如图:

①柱状图:

②线性图:

 ③环形图【甜甜圈】

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/755580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

链表的头指针、头节点和首元节点

链表的头指针、头节点和首元节点 头节点(哑结点) 有时&#xff0c;在链表的第一个节点之前会额外增设一个节点&#xff0c;该节点的数据域一般不存放数据&#xff08;有些情况下也可以存放链表的长度等信息&#xff09;&#xff0c;此节点被称为头节点。 若链表中存在头节点&…

[每周一更]-(第54期):Go的多版本管理工具

参考 https://zhuanlan.zhihu.com/p/611253641https://learnku.com/articles/78326 前文概要 Go语言从开始使用从1.13起步&#xff0c;随着泛型的支持&#xff0c;带领团队在转型Go的时候&#xff0c;做基础组件架构选型使用1.18&#xff0c;但是Go版本不断迭代想使用最新版本…

Java的日期时间API

目录 JDK8之前的日期时间API java.lang.System类 java.util.Date类 java.text.SimpleDateFormat类 java.util.Calendar(日历)类 java.util.GregorianCalendar类 JDK8中新日期时间API LocalDate、LocalTime、LocalDateTime 类 Instant类 java.time.format.DateTimeFor…

SCA Sentinel分布式系统的流量防卫兵

Sentinel官网:https://sentinelguard.io/zh-cn Sentinel:Sentinel是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量控制、流量路由、熔断降级、系统自适应保护等多个维度来帮助用户 保障微服务的稳定性 Sentinel与Hystrix对…

http连接处理(下)(四)

1.结合代码分析请求报文响应 下面我们将介绍服务器如何响应请求报文&#xff0c;并将该报文发送给浏览器端。首先介绍一些基础API&#xff0c;然后结合流程图和代码对服务器响应请求报文进行详解。 基础API部分&#xff0c;介绍stat、mmap、iovec、writev。 流程图部分&…

NodeJS 后端通过Http获取Base64格式数据显示图片 ②〇

文章目录 前言BASE64前端开发后端开发异步代码效果总结 ⡖⠒⠒⠒⠤⢄⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸ ⠀⠀⠀⡼⠀⠀⠀⠀ ⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢶⣲⡴⣗⣲⡦⢤⡏⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠋⠉⠉⠓⠛⠿⢷⣶⣦⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀…

Rust操作MySQL

查询 本部分是对 「Rust入门系列」Rust 中使用 MySQL[1]的学习与记录 经常使用的时间处理库&#xff1a; chrono 流式查询使用&#xff1a; query_iter 输出到Vec使用&#xff1a; query 映射到结构体使用&#xff1a; query_map 获取单条数据使用&#xff1a; query_first 命名…

RTP及RTP Header Extension

https://www.rfc-editor.org/rfc/rfc3550.txt 译文&#xff1a; http://www.gpssoft.cn/download/protocol/RFC-3550-%E4%B8%AD%E6%96%87%E7%89%88.pdf RTP&#xff1a;real-time transport protocol&#xff0c;实时传输协议 每一个 RTP 包中都有前 12 个字节&#xff0c;而…

了解PostgreSQL sql shell和VACUUM命令

从SQL Shell进入PostgreSQL&#xff1b;没用过这东西&#xff0c;看一下&#xff1b; 一直回车&#xff1b;最后输入口令就登入了&#xff1b;此时是登入默认的数据库postgres&#xff1b;这个数据库是默认安装的&#xff1b; 看一下有没有表&#xff0c;根据资料可以用 \d 或…

K210学习篇(五)PWM

machine.PWM PWM&#xff1a; 脉宽调制模块&#xff0c; 硬件支持的PWM&#xff0c; 可以指定任意引脚&#xff08;0到47引脚&#xff09; 每个 PWM 依赖于一个定时器&#xff0c; 即当定时器与 PWM 功能绑定后&#xff0c; 不能作为普通定时器使用了。 因为有 3 个定时器&…

go语言终端交叉编译的事项

一、可以使用的编译环境 go env 查看编译的环境 1.编译linux 64环境[centos7以及以上版本] go env -w GOOS"linux" go env -w GOARCH"amd64" 2.编译linux 32环境[centos6以及以下版本] go env -w GOOS"linux" go env -w GOARCH"386"…

动态库 的制作和使用

文章目录 重要命令制作流程和使用动态库加载失败&解决失败的原因&#xff1a;ldd命令系统加载动态库&#xff08;共享库&#xff09;的顺序问题解决途径一、修改环境变量二、修改/etc/ld.so.cache文件列表三、将动态库放在/lib 或 /usr/lib文件中&#xff08;不推荐&#x…

互联网大厂技术-Redis-集群模型、架构原理、难点应用场景、高频面试问题详解

目录 一、Redis集群模型 1.1、主从模式 1.1.1 主从模式优缺点 1.2、哨兵模式 1.2.1 哨兵模式的作用&#xff1a; 1.2.2 哨兵实现原理 1.2.3 主观下线和客观下线 1.2.4 哨兵模式优缺点 1.3、各大厂的Redis集群方案 1.3.1 客户端分片 1.3.2 代理分片 Twemproxy的优点…

ESP32开发环境的搭建

ESP32开发环境的搭建 Windows11WSL2 Ubuntu22.04 下载ESP32开发所需的库和工具链 下载ESP-IDF库安装必要的工具sudo apt-get install git wget flex bison gperf python python-pip python-setuptools python-serial python-click python-cryptography python-future python…

收款单签字时,报”结算信息表体中本方银行账户、现金账户、票据号 (商业汇票号)不能同时为空,签字操作失败“,能否取消这个校验??

大概整理&#xff0c;如有不当&#xff0c;欢迎留言指出&#xff0c;谢谢&#xff01; 收款单签字时&#xff0c;报”结算信息表体中本方银行账户、现金账户、票据号 (商业汇票号)不能同时为空&#xff0c;签字操作失败“&#xff0c;能否取消这个校验&#xff1f;&#xff1f…

设计模式(六)-----适配器模式(Adapter Pattern)

目录 什么是适配器模式适用场景适配器模式的三种实现方式1. 类的适配器模式2. 对象的适配器模式3. 接口的适配器模式 总结 什么是适配器模式 适配器模式主要用于将一个类的接口转化成客户端希望的目标类格式&#xff0c;使得原本不兼容的类可以在一起工作&#xff0c;将目标类…

2023年7月北京/广州/深圳制造业产品经理NPDP认证招生

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

Windows 10 实现实时文件夹同步的方法

什么是实时同步&#xff1f; 实时文件夹同步是一种确保在满足一定条件时立即更新一个或多个文件夹的过程。与传统的文件同步方法相比&#xff0c;它能够更及时地检测到源文件夹的变化并将这些变化快速复制到目标文件夹。 实时文件夹同步可以采用单向同步或双向同步的模式…

Flutter 状态管理框架 Provider 和 Get 分析

状态管理一直是 Flutter 开发中一个火热的话题。谈到状态管理框架&#xff0c;社区也有诸如有以Get、Provider为代表的多种方案&#xff0c;它们有各自的优缺点。面对这么多的选择&#xff0c;你可能会想&#xff1a;「我需要使用状态管理么&#xff1f;哪种框架更适合我&#…

数据安全之风险评估(三)

网络数据安全风险评估坚持预防为主、主动发现、积极防范&#xff0c;对数据处理者数据安全保护和数据处理活动进行风险评估&#xff0c;旨在掌握数据安全总体状况&#xff0c;发现数据安全隐患&#xff0c;提出数据安全管理和技术防护措施建议&#xff0c;提升数据安全防攻击、…