本文基本上看了博客C#窗体Winform,使用实时图表:折线图、柱状图_winform 折线图-CSDN博客,该博客写的很详细,在这里作为比较复述和实现了一次。
如何在C#窗体中使用实时图表,这里需要用到Chart控件。先看下Demo效果图:
一、创建Winform窗体,并找到Chart控件
Chart控件,目前仅在.net framework下才有,.net core下暂时还没有。所以本文针对的环境是.net framework下的winform窗体。
如上图,在工具箱中找到“数据”->“Chart”控件。请注意,在“所有Windows窗体”那里,是找不到Chart控件的。
二、将Chart控件拖入到窗体中
然后设置Dock属性为Bottom,效果如下图所示:
三、创建X轴变量名
如上图,找到Series属性,它表示X轴的变量,可以设置多个的,作为演示,我们仅选择简单的入门为主,即只使用一个X轴变量。
设置Series属性,名称叫做“次数”,图形使用连线方式。“确定”后效果如下图:
四、生成一些随机金额
为了让图表动态起来,我们假设每次的付款金额是有一个随机值的,那么X轴就是次数, Y轴就是每次的付款金额。
搞一个“启动”按钮在上面,双击该按钮,写入一些业务代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
namespace WindowsFormsApp3
{
public partial class Form1 : Form
{
/// <summary>
/// 过往的金额
/// </summary>
private readonly List<double> _pastMoney;
private double _maxAxisY, _minAxisY;
public Form1()
{
InitializeComponent();
this._pastMoney = new List<double>();
}
private void button1_Click(object sender, EventArgs e)
{
//启动一个后台线程
Task.Run(() =>
{
Random random = new Random();
for (; ; )
{
//生成一个四舍五入带2位小数点的随机金额
double yValue = Math.Round(random.NextDouble() * 100, 2, MidpointRounding.AwayFromZero);
this.UpdateChart(yValue);
}
}
);
}
/// <summary>
/// 每秒钟不停的更新图形,最多允许5个节点
/// </summary>
/// <param name="totalMoney"></param>
private void UpdateChart(double totalMoney)
{
this.Invoke(new Action(() =>
{
Series serie = this.chart1.Series[0];
serie.Points.SuspendUpdates();
if (serie.Points.Count == 100)
{
serie.Points.RemoveAt(0);
this._pastMoney.RemoveAt(0);
this._maxAxisY = this._pastMoney.Max(q => q);
this._minAxisY = this._pastMoney.Min(q => q);
}
if (this._maxAxisY < totalMoney)
{
this._maxAxisY = totalMoney;
}
if (this._minAxisY > totalMoney)
{
this._minAxisY = totalMoney;
}
//不断的更新图表的最大值和最小值范围,使得折线图总是显示最好看。
this.chart1.ChartAreas[0].AxisY.Maximum = _maxAxisY;
this.chart1.ChartAreas[0].AxisY.Minimum = _minAxisY;
//仅修改Y轴的值
serie.Points.AddY(totalMoney);
serie.Points.ResumeUpdates();
this._pastMoney.Add(totalMoney);
}));
Thread.Sleep(500);
}
}
}
上面是完整代码,您可以直接复制使用。该代码中的数据是随机生成的数据显示,我们可以读取自己文件中的数据进行显示,或者显示计算得到的实时数据。