在winform中绘图

今天跟大家分享一下最近做的一个程序中绘图功能的实现。

先来看看实现的效果:

绘图效果

具体实现

页面的设计

绘图设置页面的设计如下所示:

image-20231130103107766

4个label控件,控件如下所示:

image-20231130103225679

2个DateEdit控件,控件如下所示:

image-20231130103311866

1个ComboBoxEdit控件,控件如下所示:

image-20231130103435053

1个CheckedListBoxControl控件,控件如下所示:

image-20231130103557605

1个SimpleButton控件,控件如下所示:

image-20231130103726179

绘图展示的页面设计如下:

image-20231130104234323

只有一个ChartControl控件,控件如下所示:

image-20231130104310698

代码

绘图的数据是之前文章提过的使用C#实现爬虫获取网页数据得到的数据,如下所示:

image-20231130141548429

这些数据中只用了最低温度、最高温度、最低能见度、最高能见度来绘图。

第一步实现加载窗体时获取ComboBoxEdit与CheckedListBoxControl中的内容:

 public void init()
 {
     // 为下拉框框赋值
     var comboBoxItems = db.Queryable<WeatherData>().Select(x => x.StationName).Distinct().ToList();
     comboBoxEdit1.Properties.Items.AddRange(comboBoxItems);
     comboBoxEdit2.Properties.Items.AddRange(comboBoxItems);

     // 多选框的设置
     checkedListBoxControl1.CheckOnClick = true; // 设置为单击即选中或取消选中

     // 多选框中的值
     string[] indexs = { "最低温度(℃)", "最高温度(℃)", "最低可见度(km)", "最高可见度(km)" };
     // 多选框添加项
     var checkedItems = new List<CheckedListBoxItem>();
     foreach (var index in indexs)
     {
         var checkedItem = new CheckedListBoxItem();
         checkedItem.Value = index;
         checkedItems.Add(checkedItem);
     }
     checkedListBoxControl1.Items.AddRange(checkedItems.ToArray());

 }
 private void ToolbarForm1_Load(object sender, EventArgs e)
 {
     init();
 }

获取不同的站名:

 var comboBoxItems = db.Queryable<WeatherData>()
                       .Select(x => x.StationName).Distinct().ToList();

为下拉框添加值:

  comboBoxEdit1.Properties.Items.AddRange(comboBoxItems);

为多选框添加值:

     // 多选框的设置
     checkedListBoxControl1.CheckOnClick = true; // 设置为单击即选中或取消选中

     // 多选框中的值
     string[] indexs = { "最低温度(℃)", "最高温度(℃)", "最低可见度(km)", "最高可见度(km)" };
     // 多选框添加项
     var checkedItems = new List<CheckedListBoxItem>();
     foreach (var index in indexs)
     {
         var checkedItem = new CheckedListBoxItem();
         checkedItem.Value = index;
         checkedItems.Add(checkedItem);
     }
     checkedListBoxControl1.Items.AddRange(checkedItems.ToArray());

开始绘图按钮的点击事件代码:

 private void simpleButton3_Click(object sender, EventArgs e)
 {
     var date1 = dateEdit3.EditValue;
     var date2 = dateEdit4.EditValue;
     var name = comboBoxEdit2.Text;
     var checkedItems = checkedListBoxControl1.CheckedItems;
     if (date1 != null && date2 != null && name != "" && checkedItems.Count != 0)
     {
         var startDate = Convert.ToDateTime(date1);
         var endDate = Convert.ToDateTime(date2);
         var list = db.Queryable<WeatherData>().Where(x => x.Date >= startDate && x.Date < endDate.AddDays(1) && x.StationName == name).ToList();
         // 清空之前的图
         if (chartControl2.Series.Count > 0)
         {
             chartControl2.Series.Clear();
         }
         // 选中几个指标就画几个图
         foreach (CheckedListBoxItem item in checkedItems)
         {
             var indexKey = item.Value.ToString();
             switch (indexKey)
             {
                 case "最低温度(℃)":
                     Series series1 = new Series("最低温度(℃)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series1.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Tem_Low));

                     }
                     chartControl2.Series.Add(series1);
                     break;
                 case "最高温度(℃)":
                     Series series2 = new Series("最高温度(℃)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series2.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Tem_High));

                     }
                     chartControl2.Series.Add(series2);
                     break;
                 case "最低可见度(km)":
                     Series series3 = new Series("最低可见度(km)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series3.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Visibility_Low));

                     }
                     chartControl2.Series.Add(series3);
                     break;
                 case "最高可见度(km)":
                     Series series4 = new Series("最高可见度(km)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series4.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Visibility_High));

                     }
                     chartControl2.Series.Add(series4);
                     break;
             }


         }
         // 绘图完成提示
         MessageBox.Show("绘图已完成");

     }
     else
     {
         MessageBox.Show("请检查开始日期、结束日期、站名和绘图指标是否都已填写!!!");
     }



 }

数据查询:

 var list = db.Queryable<WeatherData>().Where(x => x.Date >= startDate && x.Date < endDate.AddDays(1) && x.StationName == name).ToList();

这里获取时间范围内的数据不用var list = db.Queryable<WeatherData>().Where(x => x.Date >= startDate && x.Date <=endDate && x.StationName == name).ToList();的原因是比如我选择的是2023-11-1到2023-11-15之间的数据,如下所示:

image-20231130143703492

获取的数据,如下所示:

image-20231130143801586

并没有获取到2023-11-15数据,是因为我们要获取的是2023-11-14511:00 与2023-11-15 17:00的数据,因此可以选择使用DateTime.AddDays(1)的方法解决,如下所示:

image-20231130144552812

绘图:

这里考虑的是选择几个指标就画几个图,因此可以使用switch case实现:

 switch (indexKey)
             {
                 case "最低温度(℃)":
                     Series series1 = new Series("最低温度(℃)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series1.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Tem_Low));

                     }
                     chartControl2.Series.Add(series1);
                     break;
                 case "最高温度(℃)":
                     Series series2 = new Series("最高温度(℃)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series2.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Tem_High));

                     }
                     chartControl2.Series.Add(series2);
                     break;
                 case "最低可见度(km)":
                     Series series3 = new Series("最低可见度(km)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series3.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Visibility_Low));

                     }
                     chartControl2.Series.Add(series3);
                     break;
                 case "最高可见度(km)":
                     Series series4 = new Series("最高可见度(km)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series4.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Visibility_High));

                     }
                     chartControl2.Series.Add(series4);
                     break;
             }

绘图代码:

Series series1 = new Series("最低温度(℃)", ViewType.Line);
                     foreach (var dataPoint in list)
                     {
                         series1.Points.Add(new SeriesPoint(dataPoint.Date, dataPoint.Tem_Low));

                     }
                     chartControl2.Series.Add(series1);

最后的绘图效果如下所示:

image-20231130145230125

以上就是在本案例中在winform中绘图的实现过程,希望对你有所帮助。

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

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

相关文章

前端笔记(三)CSS 盒子模型

结构伪类选择器 基本的结构伪类选择器 可以根据元素的结构关系来查找元素 比如列标签 li&#xff0c;使用 li:first-child { background-color: green; }就可以选中第一个该标签。 <!DOCTYPE html> <html lang"en"> <head><meta charset&q…

python-单词本|通讯录

编写程序&#xff0c;生词本。 def sayHello():print("" * 20 \n 欢迎使用生词本\n 1.查看生词本\n 2.背单词\n 3.添加新单词\n 4.删除单词\n 5.清空生词本\n 6.退出生词本\n * 20 \n)def addW(data):word input("请输入新单词&#xff1a;")trans i…

如何使用Cloudreve搭建本地云盘系统并实现随时远程访问

文章目录 1、前言2、本地网站搭建2.1 环境使用2.2 支持组件选择2.3 网页安装2.4 测试和使用2.5 问题解决 3、本地网页发布3.1 cpolar云端设置3.2 cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#…

mfc 设置excel 单元格的列宽

CString strTL, strBR;strTL.Format(L"%s%d", GetExcelColName(cd.nCol), cd.nRow);strBR strTL;CRange rangeMerge range.get_Range(_variant_t(strTL), _variant_t(strBR));rangeMerge.put_ColumnWidth(_variant_t((long)(20))); 宽度设置函数为 &#xff1a; pu…

Nginx安装

Nginx简介 Nginx 是一个高性能的HTTP和反向代理web服务器&#xff0c;其特点是占有内存少&#xff0c;并发能力强&#xff0c;其并发能力在同类型的网页服务器中表现较好。 Nginx安装 下载地址 安装稳定版本 下载完成后进行解压 可以双击nginx.exe 启动nginx 也可以打开cm…

nginx部署和安装-后端程序多端口访问-后端代理设置

部分补充 查看nginx是否安装http_ssl_module模块 ./nginx -V 看到有 configure arguments: --with-http_ssl_module, 则已安装。 如果没有安装&#xff1a;参考文档 nginx官网地址&#xff1a;nginx: download 这里下载nginx-1.18.0稳定版tar.gz 下载后&#xff0c;利用…

JAVA全栈开发 day16_MySql01

一、数据库 1.数据储存在哪里&#xff1f; 硬盘、网盘、U盘、光盘、内存&#xff08;临时存储&#xff09; 数据持久化 使用文件来进行存储&#xff0c;数据库也是一种文件&#xff0c;像excel &#xff0c;xml 这些都可以进行数据的存储&#xff0c;但大量数据操作&#x…

【开源】基于JAVA的校园电商物流云平台

项目编号&#xff1a; S 034 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S034&#xff0c;文末获取源码。} 项目编号&#xff1a;S034&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 商品数据模块2.3 快…

【开源】基于JAVA的考研专业课程管理系统

项目编号&#xff1a; S 035 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S035&#xff0c;文末获取源码。} 项目编号&#xff1a;S035&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高…

【C++11/线程相关】thread类编写多线程、mutex互斥锁和lock_guard、atomic原子类型

目录 通过thread类编写C多线程程序线程间互斥——mutex互斥锁和lock_guardmutex互斥锁lock_guard 线程间通信C11实现生产者与消费者模型 基于CAS操作的atomic原子类型 橙色 通过thread类编写C多线程程序 为什么结果没有子线程中所打印的字符串呢&#xff1f;因为通过detach进…

STM32串口通信初探:使用HAL库实现基本功能

在本文中&#xff0c;我们将探索如何使用STM32的HAL库来实现串口通信的基本功能。串口通信是一种常见的外设通信方式&#xff0c;用于在微控制器和其他外部设备之间进行数据传输。在STM32系列微控制器中&#xff0c;HAL库提供了简单且灵活的方法来实现串口通信。我们将重点讨论…

【模电】直流通路与交流通路

直流通路与交流通路 通常&#xff0c;在放大电路中&#xff0c;直流电源的作用和交流信号的作用总是共存的&#xff0c;即静态电流、电压和动态电流、电压总是共存的。但是由于电容、电感等电抗元件的存在&#xff0c;直流量所流经的通路与交流信号所流经的通路不完全相同。因此…

MySQL的多表查询

多表关系 一对多(多对一)-> 多对多-> 一对一-> 概述 概述 多表查询分类 内连接 代码演示--> -- 内连接演示 -- 1.查询每一个员工的姓名&#xff0c;及关联的部门的名称(隐式内连接实现) select emp.name, dept.name from emp,dept where emp.dept_id dept.id; …

STM32F407-14.3.11-01互补输出和死区插入

互补输出和死区插入 高级控制定时器&#xff08;TIM1 和 TIM8&#xff09;可以输出两路互补信号&#xff0c;并管理输出的关断与接通瞬间。 这段时间通常称为死区&#xff0c;用户必须根据与输出相连接的器件及其特性&#xff08;电平转换器的固有延迟、开关器件产生的延迟...&…

java项目日常运维需要的文档资料

一、前言 java项目开发完成&#xff0c;部署上线&#xff0c;进入项目运维阶段&#xff0c;日常工作需要准备哪些资料和文档?当项目上线后&#xff0c;运行一段时间&#xff0c;或多或少会遇到一些运维上的问题&#xff0c;比如服务器磁盘饱满&#xff0c;服务器CPU&#xff0…

根文件系统初步测试

一. 简介 上一篇文章学习了向所编译生成的根文件系统中加入 lib库文件。文章地址如下&#xff1a; 根文件系统lib库添加与初步测试-CSDN博客 本文继上一篇文章的学习&#xff0c;本文对之前制作的根文件系统进行一次初步测试。 二. 根文件系统初步测试 为了方便测试&#…

如何使用 Docker 安装 Node-RED

安装 Node-RED 使用 Docker 是一种简便的方式&#xff0c;以下是基本的步骤&#xff1a; 安装 Docker&#xff1a; 确保已在系统上安装 Docker。可从 Docker 官方网站 或 Windows Docker 安装教程 获取安装指南。 拉取运行 Node-RED 镜像&#xff1a; 打开终端或命令行界面&am…

企业架构LB-服务器的负载均衡之Haproxy实现

企业架构LB-服务器的负载均衡之HAProxy实现 学习目标和内容 1、能够通过HAProxy实现负载均衡 ###1、介绍 Introduction HAProxy, which stands for High Availability Proxy, is a popular opensource software TCP/HTTP LoadBalancer and proxying solution which can be ru…

​ 华大基因发布《2023年全球地中海贫血认知现状报告》

在地中海沿岸地区、非洲、中东、东南亚和中国南部&#xff0c;一种名为地中海贫血&#xff08;以下简称“地贫”&#xff09;的遗传性血红蛋白疾病十分高发&#xff0c;已成为严重危害公共健康和社会稳定的重大问题。近日&#xff0c;华大基因发布《2023年全球地中海贫血认知现…

pip命令详解

pip命令介绍 pip是由Ian Bicking在2008年提出的&#xff0c;他将pyinstall重命名为pip。名称pip是首字母缩写词&#xff0c;全称为“Package Installer for Python”。自Python3的3.4版本以及Python2的2.7.9版本开始&#xff0c;pip被直接包括在Python的安装包内&#xff0c;成…