C#實(shí)現(xiàn)運(yùn)行狀態(tài)堆疊柱狀圖
本文實(shí)例為大家分享了C#實(shí)現(xiàn)運(yùn)行狀態(tài)堆疊柱狀圖的具體代碼,供大家參考,具體內(nèi)容如下
需求通過柱狀圖顯示設(shè)備運(yùn)行時(shí)間停止時(shí)間,稼動(dòng)率等
通過數(shù)據(jù)庫查詢記錄,按小時(shí)顯示顯示目標(biāo)數(shù)據(jù)。
界面設(shè)計(jì)
添加用戶控件(窗體)
代碼如下
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<SysTimeCnt> ListAllTime=new List<SysTimeCnt>(); ? ? ? ? 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) ? ? ? ? { ? ? ? ? ? ? // 判斷時(shí)間設(shè)置 ? ? ? ? ? ? if (Hours == 0) ? ? ? ? ? ? ? ? MessageBox.Show("時(shí)間設(shè)置間隔小于1小時(shí),請(qǐng)重新設(shè)置時(shí)間", "警告", MessageBoxButtons.OK); ? ? ? ? ? ? else if(Days != 0) ? ? ? ? ? ? ? ? MessageBox.Show("時(shí)間間隔大于24小時(shí),請(qǐng)重新設(shè)置時(shí)間", "警告", 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(); ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// ?圖表繪制 ? ? ? ? /// </summary> ? ? ? ? private void Plot() ? ? ? ? { ? ? ? ? ? ? this.chart1.Series.Clear(); ? ? ? ? ? ? ? ? ?// 清空?qǐng)D表 ? ? ? ? ? ? this.chart1.Legends.Clear(); ? ? ? ? ? ? this.chart1.ChartAreas.Clear(); ? ? ? ? ? ? if (ListAllTime == null || ListAllTime.Count == 0) ? ? ? ? ? ? { MessageBox.Show("數(shù)據(jù)為空"); return; } ? ? ? ? ? ? // 輔助設(shè)置 ? ? ? ? ? ? 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 ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// ?數(shù)據(jù)繪制 ? ? ? ? /// </summary> ? ? ? ? /// <param name="seriesName">數(shù)據(jù)名字</param> ? ? ? ? /// <param name="data">數(shù)據(jù)</param> ? ? ? ? /// <param name="chartType">chart類型</param> ? ? ? ? /// <param name="isPrimary">是否為主軸數(shù)據(jù)</param> ? ? ? ? private void ChartPlot(TimeType type) ? ? ? ? { ? ? ? ? ? ? string seriesName = ""; ? ? ? ? ? ? SeriesChartType chartType = SeriesChartType.StackedColumn; ? ? ? ? ? ? bool isPrimary = true; ? ? ? ? ? ? switch (type) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? case TimeType.RunTime: ? ? ? ? ? ? ? ? ? ? seriesName = "運(yùn)行時(shí)間"; break; ? ? ? ? ? ? ? ? case TimeType.StopTime: ? ? ? ? ? ? ? ? ? ? seriesName = "待機(jī)時(shí)間"; break; ? ? ? ? ? ? ? ? case TimeType.AlmTime: ? ? ? ? ? ? ? ? ? ? seriesName = "報(bào)警時(shí)間"; break; ? ? ? ? ? ? ? ? case TimeType.RunRate: ? ? ? ? ? ? ? ? ? ? seriesName = "稼動(dòng)率"; ? ? ? ? ? ? ? ? ? ? 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++; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 坐標(biāo)軸設(shè)置 ? ? ? ? /// </summary> ? ? ? ? private void AxiesSet() ? ? ? ? { ? ? ? ? ? ? ChartArea chartAreas = this.chart1.ChartAreas.Add("ChartAreas"); ? ? ? ? ? ? chartAreas.AxisX.MajorGrid.Enabled = false; ? ? ? ? ? ? // 坐標(biāo)軸 ? ? ? ? ? ? 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; ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// ?標(biāo)簽設(shè)置 ? ? ? ? /// </summary> ? ? ? ? private void LegendSet() ? ? ? ? { ? ? ? ? ? ? Legend legend = this.chart1.Legends.Add("Legend"); ? ? ? ? ? ? legend.Alignment = StringAlignment.Center; ? ? ? ? ? ? ?// 標(biāo)簽居中 ? ? ? ? ? ? legend.Docking = Docking.Top; ? ? ? ? ? ? ? ? ? ? ? ? ? // ? ? 上方 ? ? ? ? } ? ? ? ? /// <summary> ? ? ? ? /// 初始化數(shù)據(jù)列,默認(rèn)全部停止時(shí)間 ? ? ? ? /// </summary> ? ? ? ? /// <param name="brandom"></param> ? ? ? ? /// <returns></returns> ? ? ? ? public bool InitDataList(bool brandom=false) ? ? ? ? { ? ? ? ? ? ? if (Days != 0) ? ? ? ? ? ? { MessageBox.Show("時(shí)間設(shè)置異常"); 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("完成"); ? ? ? ? } ? ? }
顯示效果
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
DirectInfo.GetFiles返回?cái)?shù)組的默認(rèn)排序示例
這篇文章主要介紹了,DirectInfo.GetFiles返回?cái)?shù)組的默認(rèn)排序示例NTFS和CDFS下,是按照字母順序,而FAT下,按照文件創(chuàng)建時(shí)間順序2014-01-01Unity實(shí)現(xiàn)汽車前后輪倒車軌跡計(jì)算
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)汽車前后輪倒車軌跡計(jì)算,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09關(guān)于finalize機(jī)制和引用、引用隊(duì)列的用法詳解
下面小編就為大家?guī)硪黄P(guān)于finalize機(jī)制和引用、引用隊(duì)列的用法詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09