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

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;
        }
    }
}

运行如图:

①柱状图:

②线性图:

 ③环形图【甜甜圈】

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

COT、COT-SC、TOT 大预言模型思考方式||底层逻辑:prompt设定

先讲一下具体缩写的意思 COT-chain of thoughts COT-SC (Self-consistency) Tree of thoughts:Deliberate problem solving with LLM 我理解其实不复杂 1. 最简单的是&#xff1a;直接大白话问一次 &#xff08;IO&#xff09; 2. 进阶一点是&#xff1a;思维链&#xff0c;…

PDF转CAD后尺寸如何保持一致?这几种方法可以尝试一下

CAD文件是可编辑的&#xff0c;可以进行修改、添加和删除&#xff0c;这使得在CAD软件中进行编辑更加容易和灵活。这意味着&#xff0c;如果需要对图纸进行修改或者添加新的元素&#xff0c;可以直接在CAD软件中进行操作&#xff0c;而不需要重新制作整个图纸。那么将PDF文件转…

Linux嵌入式项目-智能家居

一、资料下载 二、框架知识 三、MQTT通信协议 1、上位机APP主要工作 1.wait for msg / while(1)订阅等待消息 2.处理消息 客户端创建了两个线程&#xff0c;一个线程用于发布消息&#xff0c;一个线程用于监听订阅消息 &#xff08;那我的仿真系统也可以啊&#xff0c;一个…

DVDNET A FAST NETWORK FOR DEEP VIDEO DENOISING

DVDNET: A FAST NETWORK FOR DEEP VIDEO DENOISING https://ieeexplore.ieee.org/document/8803136 摘要 现有的最先进视频去噪算法是基于补丁的方法&#xff0c;以往的基于NN的算在其性能上无法与其媲美。但是本文提出NN的视频去噪算法性能要好&#xff1a; 其相比于基于补丁…

Oracle通过函数调用dblink同步表数据方案(全量/增量)

创建对应的包&#xff0c;以方便触发调用 /*包声明*/ CREATE OR REPLACE PACKAGE yjb.pkg_scene_job AS /*创建同步任务*/FUNCTION F_SYNC_DRUG_STOCK RETURN NUMBER;/*同步*/PROCEDURE PRC_SYNC_DRUG_STOCK(RUNJOB VARCHAR2) ; END pkg_scene_job; /*包体*/ CREATE OR REPL…

深入理解netfilter和iptables

目录 Netfilter的设计与实现 内核数据包处理流 netfilter钩子 钩子触发点 NF_HOOK宏与Netfilter裁定 回调函数与优先级 iptables 内核空间模块 xt_table的初始化 ipt_do_table() 复杂度与更新延时 用户态的表&#xff0c;链与规则 conntrack Netfilter(结合iptable…

100种思维模型之安全边际思维模型-92

安全边际&#xff0c; 简而言之即距离某一件糟糕的事件发生&#xff0c;还有多大的空间&#xff0c;安全边际越高&#xff0c;我们就越安全&#xff01; 安全边际思维模型一个 让生活变得更从容 的 思维模型。 01、何谓安全边际思维模型 一、安全边际思维 安全边际 源于…

ACL 2023 | 持续进化中的语言基础模型

尽管如今的 AI 模型已经具备了理解自然语言的能力&#xff0c;但科研人员并没有停止对模型的不断改善和理论探索。自然语言处理&#xff08;NLP&#xff09;领域的技术始终在快速变化和发展当中&#xff0c;酝酿着新的潮流和突破。 NLP 领域的顶级学术会议国际计算语言学年会 …

声网 Agora音视频uniapp插件跑通详解

一、前言 在使用声网SDK做音视频会议开发时, 通过声网官方论坛 了解到,声网是提供uniapp插件的,只是在官方文档中不是很容易找到。 插件地址如下: Agora音视频插件 Agora音视频插件(JS) 本文讲解如何跑通演示示例 二、跑通Demo 2.1 环境安装: 参考: 2. 通过vue-…

vue3+element+sortablejs实现table表格 行列动态拖拽

vue3elementsortablejs实现table动态拖拽 1.第一步我们要安装sortablejs依赖2.在我们需要的组件中引入3.完整代码4.效果 1.第一步我们要安装sortablejs依赖 去博客设置页面&#xff0c;选择一款你喜欢的代码片高亮样式&#xff0c;下面展示同样高亮的 代码片. npm install so…

巩固一下NodeJs

1、初始化(确保当前电脑有node环境) npm init 2、安装express npm i expressnpm i ws文件结构 3、编写相关代码启动node服务(server.js) //导入下列模块&#xff0c;express搭建服务器&#xff0c;fs用来操作文件、ws用来实现webscoket const express require("expr…

Android 使用webView打开网页可以实现自动播放音频

使用webview 自动播放音视频&#xff0c;场景如&#xff0c;流媒体自动部分&#xff0c;音视频通话等。会出现如下问题&#xff1a; 解决方案如下&#xff1a; 配置webview 如下&#xff0c;这样可以自动播放音频。 webView.getSettings().setMediaPlaybackRequiresUserGestur…

原生JS实现图片裁剪功能

功能介绍&#xff1a;图片通过原生input上传&#xff0c;使用canvas进行图片裁剪。 裁剪框限制不允许超出图片范围&#xff0c;图片限制了最大宽高&#xff08;自行修改要的尺寸&#xff09;&#xff0c;点击确认获取新的base64图片数据 注&#xff1a;fixed布局不适用该方案&…

在vue中点击弹框给弹框中的表格绑值

场景描述&#xff1a;如下图所示&#xff0c;我们需要点击 ‘账单生成’ 按钮&#xff0c;然后里边要展示一个下图这样的表格。 最主要的是如何展示表格中的内容&#xff0c;一起看看吧&#xff01; <template><!-- 水费 欠费--><el-dialog title"水费欠费…

短视频seo矩阵源码开发与实践分享

在短视频矩阵系统源码开发中&#xff0c;需要注意以下几个细节&#xff1a; 1. 确定系统的功能需求&#xff1a;在开发短视频矩阵系统源码时&#xff0c;必须先明确系统的功能需求&#xff0c;包括用户的基本操作、系统数据的生成和处理等。 2. 定义数据库结构&#xff1a;短…

零售数字化转型如何破局?这篇文章全说清了!

“数字化转型”&#xff0c;一个老生常谈的话题。自19世纪互联网崭露头角&#xff0c;亚马逊和eBay等电商平台崛起&#xff0c;引领电子商务的发展。传统零售业开始意识到在线渠道的重要性&#xff0c;并纷纷推出自己的电子商务网站&#xff0c;从自此进入数字化转型的赛道当中…

利用电价运行策略研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

STM32单片机语音识别台灯控制系统人检测亮度调节

实践制作DIY- GC00156-语音识别台灯控制系统 一、功能说明&#xff1a; 基于STM32单片机设计-语音识别台灯控制系统 二、功能说明&#xff1a; 电路&#xff1a;STM32F103C系列最小系统串口语音识别模块LED灯板1个红外传感器 1.任何时候没有人则关闭灯。有人可以自动打开灯。…

激斗云计算:互联网大厂打响新一轮排位战

大模型如同一辆时代列车&#xff0c;所有科技大厂都想上车。 自去年底ChatGPT一炮而红&#xff0c;国内外数十家科技大厂、创业公司、机构相继下场&#xff0c;一时间掀起大模型的热浪。 《中国人工智能大模型地图研究报告》显示&#xff0c;截至今年5月28日&#xff0c;中国…

contentEditable属性

我们最常用的输入文本内容便是input与textarea&#xff0c;但是有一个属性&#xff0c;可以让我们在很多标签中&#xff0c;如div,table,p,span,body等&#xff0c;可以像input输入框一样&#xff0c;实现文本编辑&#xff0c;这便是contentEditable属性 之前有用到这个属性是在…