这篇文章主要为大家详细介绍了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<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)
{
// 判断时间设置
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();
}
/// <summary>
/// 图表绘制
/// </summary>
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
}
/// <summary>
/// 数据绘制
/// </summary>
/// <param name="seriesName">数据名字</param>
/// <param name="data">数据</param>
/// <param name="chartType">chart类型</param>
/// <param name="isPrimary">是否为主轴数据</param>
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++;
}
}
/// <summary>
/// 坐标轴设置
/// </summary>
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;
}
/// <summary>
/// 标签设置
/// </summary>
private void LegendSet()
{
Legend legend = this.chart1.Legends.Add("Legend");
legend.Alignment = StringAlignment.Center; // 标签居中
legend.Docking = Docking.Top; // 上方
}
/// <summary>
/// 初始化数据列,默认全部停止时间
/// </summary>
/// <param name="brandom"></param>
/// <returns></returns>
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#实现运行状态堆叠柱状图
基础教程推荐
猜你喜欢
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- ZooKeeper的安装及部署教程 2023-01-22
- C# 调用WebService的方法 2023-03-09
- C#类和结构详解 2023-05-30
- winform把Office转成PDF文件 2023-06-14
- C# List实现行转列的通用方案 2022-11-02
- C#控制台实现飞行棋小游戏 2023-04-22
- C# windows语音识别与朗读实例 2023-04-27
- unity实现动态排行榜 2023-04-27
- 一个读写csv文件的C#类 2022-11-06