小编给大家分享一下如何使用C#实现运行状态堆叠柱状图,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

具体内容如下

需求通过柱状图显示设备运行时间停止时间,稼动率等
通过数据库查询记录,按小时显示显示目标数据。

界面设计

添加用户控件(窗体)

代码如下

usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Windows.Forms;usingSystem.Windows.Forms.DataVisualization.Charting;namespaceTestRunChart{publicpartialclassSysTimeBarChart:UserControl{publicList<SysTimeCnt>ListAllTime=newList<SysTimeCnt>();publicSysTimeBarChart(){InitializeComponent();this.chart1.Series.Clear();}publicDateTimetimeStart{get{DateTimeTime1=this.dateTimePickerLast.Value;DateTimeTime2=this.dateTimePickerStart.Value;returnTime1>=Time2?Time2:Time1;}}publicDateTimetimeEnd{get{DateTimeTime1=this.dateTimePickerLast.Value;DateTimeTime2=this.dateTimePickerStart.Value;returnTime1>Time2?Time1:Time2;}}publicintHours{get{TimeSpants1=newTimeSpan(timeStart.Ticks);TimeSpants2=newTimeSpan(timeEnd.Ticks);TimeSpants=ts1.Subtract(ts2).Duration();returnts.Hours;}}publicintDays{get{TimeSpants1=newTimeSpan(timeStart.Ticks);TimeSpants2=newTimeSpan(timeEnd.Ticks);TimeSpants=ts1.Subtract(ts2).Duration();returnts.Days;}}privatevoidbtn_GetChart_Click(objectsender,EventArgse){//判断时间设置if(Hours==0)MessageBox.Show("时间设置间隔小于1小时,请重新设置时间","警告",MessageBoxButtons.OK);elseif(Days!=0)MessageBox.Show("时间间隔大于24小时,请重新设置时间","警告",MessageBoxButtons.OK);elsePlot();}privatevoidbtn_clear_Click(objectsender,EventArgse){this.chart1.Series.Clear();this.chart1.Legends.Clear();this.chart1.ChartAreas.Clear();ListAllTime.Clear();}///<summary>///图表绘制///</summary>privatevoidPlot(){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);elseif(this.rbt_StopTime.Checked)ChartPlot(TimeType.StopTime);elseif(this.rbt_almtime.Checked)ChartPlot(TimeType.AlmTime);elseif(this.rbt_runrate.Checked)ChartPlot(TimeType.RunRate);else{ChartPlot(TimeType.RunTime);ChartPlot(TimeType.StopTime);ChartPlot(TimeType.AlmTime);ChartPlot(TimeType.RunRate);}}enumTimeType{RunTime,AlmTime,StopTime,RunRate}///<summary>///数据绘制///</summary>///<paramname="seriesName">数据名字</param>///<paramname="data">数据</param>///<paramname="chartType">chart类型</param>///<paramname="isPrimary">是否为主轴数据</param>privatevoidChartPlot(TimeTypetype){stringseriesName="";SeriesChartTypechartType=SeriesChartType.StackedColumn;boolisPrimary=true;switch(type){caseTimeType.RunTime:seriesName="运行时间";break;caseTimeType.StopTime:seriesName="待机时间";break;caseTimeType.AlmTime:seriesName="报警时间";break;caseTimeType.RunRate:seriesName="稼动率";chartType=SeriesChartType.Line;isPrimary=false;//非主轴,右边轴break;default:break;}Seriesseries=this.chart1.Series.Add(seriesName);series.ChartType=chartType;//图表类型series.YAxisType=isPrimary?AxisType.Primary:AxisType.Secondary;series.BorderWidth=2;series.Label=isPrimary?"#VAL":"#VAL{P}";inti=0;foreach(varminListAllTime){doublemvalue=0;switch(type){caseTimeType.RunTime:mvalue=m.RunTime;break;caseTimeType.StopTime:mvalue=m.StopTime;break;caseTimeType.AlmTime:mvalue=m.AlmTime;break;caseTimeType.RunRate:mvalue=m.RunRate;break;default:break;}series.Points.AddXY(i,mvalue);i++;}}///<summary>///坐标轴设置///</summary>privatevoidAxiesSet(){ChartAreachartAreas=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;}///<summary>///标签设置///</summary>privatevoidLegendSet(){Legendlegend=this.chart1.Legends.Add("Legend");legend.Alignment=StringAlignment.Center;//标签居中legend.Docking=Docking.Top;//上方}///<summary>///初始化数据列,默认全部停止时间///</summary>///<paramname="brandom"></param>///<returns></returns>publicboolInitDataList(boolbrandom=false){if(Days!=0){MessageBox.Show("时间设置异常");returnfalse;}varstartTime=timeStart;ListAllTime.Clear();Randomrd=newRandom();for(inti=0;i<=Hours;i++){varnum=rd.Next(0,59);SysTimeCntmCnt=newSysTimeCnt(){_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);}returntrue;}}publicclassSysTimeCnt{publicstring_InSertTime;publicstringInSertTime=>_InSertTime;publicvoidUpdateInSertTime(){_InSertTime=string.Format("{0:yyyy-MM-dd-HH-mm}",DateTime.Now);}publicdoubleRunTime;publicdoubleAlmTime;publicdoubleStopTime{get{return60-RunTime-AlmTime;}}publicdoubleRunRate{get{returnMath.Round(Convert.ToDouble(this.RunTime/60),2);}}}}

主窗体代码

publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbtn_AddData_Click(objectsender,EventArgse){varbSucessd=sysTimeBarChart1.InitDataList(true);if(bSucessd)MessageBox.Show("完成");}}

显示效果

以上是“如何使用C#实现运行状态堆叠柱状图”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!