C#实现运行状态堆叠柱状图

 更新时间:2022年02月12日 11:47:13   作者:机器侠客  
这篇文章主要为大家详细介绍了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("完成");
        }
    }

显示效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • WindowsForm实现TextBox占位符Placeholder提示功能

    WindowsForm实现TextBox占位符Placeholder提示功能

    这篇文章主要介绍了WindowsForm实现TextBox占位符Placeholder提示,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • C#自定义字符串压缩和解压缩的方法

    C#自定义字符串压缩和解压缩的方法

    这篇文章主要介绍了C#自定义字符串压缩和解压缩的方法,通过自定义C#字符串操作类实现对字符串的压缩与解压的功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • 详解WPF中的隧道路由和冒泡路由事件

    详解WPF中的隧道路由和冒泡路由事件

    这篇文章主要介绍了WPF中的隧道路由和冒泡路由事件的相关资料,帮助大家更好的理解和学习使用c#的wpf,感兴趣的朋友可以了解下
    2021-04-04
  • WinForm IP地址输入框控件实现

    WinForm IP地址输入框控件实现

    这篇文章主要为大家详细介绍了WinForm IP地址输入框控件的实现代码,基于VS2010模拟windows系统自带IP输入框,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 初学C#所需明白的那些点

    初学C#所需明白的那些点

    这篇文章主要介绍了初学C#所需明白的那些点,以及一些零碎知识点笔记,以供大家学习参考
    2023-03-03
  • C# 中的??操作符浅谈

    C# 中的??操作符浅谈

    (??) 用于如果类不为空值时返回它自身,如果为空值则返回之后的操作
    2013-04-04
  • C# 泛型集合的自定义类型排序的实现

    C# 泛型集合的自定义类型排序的实现

    这篇文章主要介绍了C# 泛型集合的自定义类型排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 在WinForm中发送HTTP请求的实现方法

    在WinForm中发送HTTP请求的实现方法

    下面小编就为大家带来一篇在WinForm中发送HTTP请求的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • C# 并行和多线程编程——Task进阶知识

    C# 并行和多线程编程——Task进阶知识

    这篇文章主要介绍了C# 并行和多线程编程——Task进阶知识的的相关资料,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-02-02
  • C#/VB.NET实现在Word文档中添加页眉和页脚

    C#/VB.NET实现在Word文档中添加页眉和页脚

    页眉位于文档中每个页面的顶部区域,常用于显示文档的附加信息;页脚位于文档中每个页面的底部的区域,常用于显示文档的附加信息。今天这篇文章就将为大家展示如何以编程的方式在在 Word 文档中添加页眉和页脚
    2023-03-03

最新评论