如何使用C#实现运行状态堆叠柱状图
发表于:2025-11-06 作者:千家信息网编辑
千家信息网最后更新 2025年11月06日,小编给大家分享一下如何使用C#实现运行状态堆叠柱状图,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下需求通过柱状
千家信息网最后更新 2025年11月06日如何使用C#实现运行状态堆叠柱状图
小编给大家分享一下如何使用C#实现运行状态堆叠柱状图,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
具体内容如下
需求通过柱状图显示设备运行时间停止时间,稼动率等
通过数据库查询记录,按小时显示显示目标数据。
界面设计
添加用户控件(窗体)
代码如下
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Windows.Forms;using System.Windows.Forms.DataVisualization.Charting;namespace TestRunChart{ public partial class SysTimeBarChart : UserControl { public List ListAllTime=new List(); public SysTimeBarChart() { InitializeComponent(); this.chart1.Series.Clear(); } public DateTime timeStart { get{ DateTime Time1 = this.dateTimePickerLast.Value; DateTime Time2 = this.dateTimePickerStart.Value; return Time1 >= Time2? Time2 : Time1; } } public DateTime timeEnd { get { DateTime Time1 = this.dateTimePickerLast.Value; DateTime Time2 = this.dateTimePickerStart.Value; return Time1 > Time2 ? Time1 : Time2; } } public int Hours { get { TimeSpan ts1 = new TimeSpan(timeStart.Ticks); TimeSpan ts2 = new TimeSpan(timeEnd.Ticks); TimeSpan ts = ts1.Subtract(ts2).Duration(); return ts.Hours; } } public int Days { get { TimeSpan ts1 = new TimeSpan(timeStart.Ticks); TimeSpan ts2 = new TimeSpan(timeEnd.Ticks); TimeSpan ts = ts1.Subtract(ts2).Duration(); return ts.Days; } } private void btn_GetChart_Click(object sender, EventArgs e) { // 判断时间设置 if (Hours == 0) MessageBox.Show("时间设置间隔小于1小时,请重新设置时间", "警告", MessageBoxButtons.OK); else if(Days != 0) MessageBox.Show("时间间隔大于24小时,请重新设置时间", "警告", MessageBoxButtons.OK); else Plot(); } private void btn_clear_Click(object sender, EventArgs e) { this.chart1.Series.Clear(); this.chart1.Legends.Clear(); this.chart1.ChartAreas.Clear(); ListAllTime.Clear(); } /// /// 图表绘制 /// private void Plot() { this.chart1.Series.Clear(); // 清空图表 this.chart1.Legends.Clear(); this.chart1.ChartAreas.Clear(); if (ListAllTime == null || ListAllTime.Count == 0) { MessageBox.Show("数据为空"); return; } // 辅助设置 AxiesSet(); LegendSet(); // 表格绘制 if (this.rbt_runTime.Checked) ChartPlot(TimeType.RunTime); else if (this.rbt_StopTime.Checked) ChartPlot(TimeType.StopTime); else if (this.rbt_almtime.Checked) ChartPlot(TimeType.AlmTime); else if (this.rbt_runrate.Checked) ChartPlot(TimeType.RunRate); else { ChartPlot(TimeType.RunTime); ChartPlot(TimeType.StopTime); ChartPlot(TimeType.AlmTime); ChartPlot(TimeType.RunRate); } } enum TimeType { RunTime, AlmTime, StopTime, RunRate } /// /// 数据绘制 /// /// 数据名字 /// 数据 /// chart类型 /// 是否为主轴数据 private void ChartPlot(TimeType type) { string seriesName = ""; SeriesChartType chartType = SeriesChartType.StackedColumn; bool isPrimary = true; switch (type) { case TimeType.RunTime: seriesName = "运行时间"; break; case TimeType.StopTime: seriesName = "待机时间"; break; case TimeType.AlmTime: seriesName = "报警时间"; break; case TimeType.RunRate: seriesName = "稼动率"; chartType = SeriesChartType.Line; isPrimary = false;//非主轴,右边轴 break; default: break; } Series series = this.chart1.Series.Add(seriesName); series.ChartType = chartType; // 图表类型 series.YAxisType = isPrimary ? AxisType.Primary : AxisType.Secondary; series.BorderWidth = 2; series.Label = isPrimary ? "#VAL" : "#VAL{P}"; int i = 0; foreach (var m in ListAllTime) { double mvalue = 0; switch (type) { case TimeType.RunTime: mvalue = m.RunTime; break; case TimeType.StopTime: mvalue = m.StopTime; break; case TimeType.AlmTime: mvalue = m.AlmTime; break; case TimeType.RunRate: mvalue = m.RunRate; break; default: break; } series.Points.AddXY(i, mvalue); i++; } } /// /// 坐标轴设置 /// private void AxiesSet() { ChartArea chartAreas = this.chart1.ChartAreas.Add("ChartAreas"); chartAreas.AxisX.MajorGrid.Enabled = false; // 坐标轴 chartAreas.AxisY.MajorGrid.Enabled = false; // Y轴主轴 chartAreas.AxisY.Maximum = 60; chartAreas.AxisY2.MajorGrid.Enabled = false; // Y轴次轴 chartAreas.AxisY2.Enabled = AxisEnabled.True; chartAreas.AxisY2.LabelStyle.Format = "0%"; chartAreas.AxisY2.Maximum = 1; } /// /// 标签设置 /// private void LegendSet() { Legend legend = this.chart1.Legends.Add("Legend"); legend.Alignment = StringAlignment.Center; // 标签居中 legend.Docking = Docking.Top; // 上方 } /// /// 初始化数据列,默认全部停止时间 /// /// /// public bool InitDataList(bool brandom=false) { if (Days != 0) { MessageBox.Show("时间设置异常"); return false; } var startTime = timeStart; ListAllTime.Clear(); Random rd = new Random(); for (int i = 0; i <= Hours; i++) { var num = rd.Next(0, 59); SysTimeCnt mCnt = new SysTimeCnt() { _InSertTime = string.Format("{0:yyyy-MM-dd-HH-mm}", startTime), RunTime = brandom? num:0, AlmTime = brandom ? rd.Next(0, 60 - num):0 }; ListAllTime.Add(mCnt); startTime.AddHours(1); } return true; } } public class SysTimeCnt { public string _InSertTime; public string InSertTime => _InSertTime; public void UpdateInSertTime() { _InSertTime = string.Format("{0:yyyy-MM-dd-HH-mm}", DateTime.Now); } public double RunTime; public double AlmTime; public double StopTime { get { return 60 - RunTime - AlmTime; } } public double RunRate { get { return Math.Round(Convert.ToDouble(this.RunTime / 60), 2); } } }} 主窗体代码
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btn_AddData_Click(object sender, EventArgs e) { var bSucessd = sysTimeBarChart1.InitDataList(true); if (bSucessd) MessageBox.Show("完成"); } }显示效果

以上是"如何使用C#实现运行状态堆叠柱状图"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
时间
数据
运行
柱状
内容
图表
小时
篇文章
状态
C#
主轴
代码
坐标
坐标轴
标签
窗体
类型
不怎么
右边
名字
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全监测装置 技术规范
网络安全大赛专业术语
天龙八部手游互通属于哪个服务器
原神切换服务器2.5版本
河北电脑软件开发费用是多少
社区网络安全周宣传总结
加油站清空数据库操作视频
服务器上传数据如何处理掉
换手机后王者荣耀服务器进不去
米咖科技卢焕辉互联网发展史
网络安全态势感知规范
山东服务器回收推荐云主机
app软件开发解决方案找哪家
哈尔滨软件开发专业怎么样
vr存储服务器
ps5 与游戏服务器的连接出现问题
铁四院网络安全
对日软件开发没落2018
龙岩政务软件开发定制
软件开发技术培训班6
传奇数据库物品属性
scum怎么删除服务器人物
数据库held
高校网络安全意识形态制度
求生之路一进服务器就断开怎么办
网络安全专业考研方向
关于计算机网络技术的论文
云联客户端服务器地址端口填什么
中山无限软件开发平均价格
河南三本计算机数据库