首页  ·  知识 ·  编程语言
使用ZedGraph显示动态/实时数据
佚名  本站原创  .NET  编辑:dezai  图片来源:网络
ZedGraph控件能够显示动态或静态数据。若要定时的向一个图表里添加数据,应按照如下顺序实现:1.在GraphPane.CurveList集合中查找CurveItem2.在

ZedGraph控件能够显示动态或静态数据。
若要定时的向一个图表里添加数据,应按照如下顺序实现:
1.在GraphPane.CurveList集合中查找CurveItem
2.在CurveItem中访问PointPairList(或者其它的IPointList),根据自己的需要增加新数据或修改已存在的数据
3.调用ZedGraphControl.AxisChange()方法更新X和Y轴的范围
4.调用Form.Invalidate()方法更新图表
/*翻译的不准,大概意思就是找到数据集合后增加/修改数据->修改轴范围->更新图表*/

每 个CurveItem里的数据点作为一个IPointList接口的引用存储在CurveItem.Points中.注意数据点列表能被任意一个实现了 IPointList的接口的类引用.当然,此类需要同时实现IPoiontListEdit(),IpointListEdit.Add()和 IPontListEdit.RemoveAt()方法.

The code sample is for a form that implements a ZedGraphControl with a Timer event to show dynamically updated data. You can download the complete project from the links below:
代码示例为一个ZedGraph控件在WinForm中的实现,用Timer事件动态显示更新数据.

以下是完整代码(没有VS设计资料).
此代码包括两个方法:Form_Load()方法用一条没有数据点的曲线初始化图表,Timer_Tick()方法响应timer事件增加数据点.

Visual C# Code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ZedGraph;

namespace DynamicData
...{
   public partial class Form1 : Form
   ...{
      // Starting time in milliseconds
      int tickStart = 0;

      public Form1()
      ...{
         InitializeComponent();
      }

      private void Form1_Load( object sender, EventArgs e )
      ...{
         //获取引用
         GraphPane myPane = zedGraphControl1.GraphPane;
         //设置标题
         myPane.Title.Text = "Test of Dynamic Data Update with ZedGraph " +
               "(After 25 seconds the graph scrolls)";
         //设置X轴说明文字
         myPane.XAxis.Title.Text = "Time, Seconds";
         //设置Y轴文字
         myPane.YAxis.Title.Text = "Sample Potential, Volts";

         // Save 1200 points.  At 50 ms sample rate, this is one minute
         // The RollingPointPairList is an efficient storage class that always
         // keeps a rolling set of point data without needing to shift any data values
         //设置1200个点,假设每50毫秒更新一次,刚好检测1分钟
         //一旦构造后将不能更改这个值
         RollingPointPairList list = new RollingPointPairList( 1200 );

         // Initially, a curve is added with no data points (list is empty)
         // Color is blue, and there will be no symbols
         //开始,增加的线是没有数据点的(也就是list为空)
         //增加一条名称:Voltage,颜色Color.Bule,无符号,无数据的空线条
         LineItem curve = myPane.AddCurve( "Voltage", list, Color.Blue, SymbolType.None );

         // Sample at 50ms intervals
         //设置timer控件的间隔为50毫秒
         timer1.Interval = 50;
         //timer可用
         timer1.Enabled = true;
         //开始
         timer1.Start();

         // Just manually control the X axis range so it scrolls continuously
         // instead of discrete step-sized jumps
         //X轴最小值0
         myPane.XAxis.Scale.Min = 0;
         //X轴最大30
         myPane.XAxis.Scale.Max = 30;
         //X轴小步长1,也就是小间隔
         myPane.XAxis.Scale.MinorStep = 1;
         //X轴大步长为5,也就是显示文字的大间隔
         myPane.XAxis.Scale.MajorStep = 5;

         // Scale the axes
         //改变轴的刻度
         zedGraphControl1.AxisChange();

         // Save the beginning time for reference
         //保存开始时间
         tickStart = Environment.TickCount;
      }

      private void timer1_Tick( object sender, EventArgs e )
      ...{
         // Make sure that the curvelist has at least one curve
         //确保CurveList不为空
         if ( zedGraphControl1.GraphPane.CurveList.Count <= 0 )
            return;
        
         // Get the first CurveItem in the graph
         //取Graph第一个曲线,也就是第一步:在GraphPane.CurveList集合中查找CurveItem
         LineItem curve = zedGraphControl1.GraphPane.CurveList[0] as LineItem;
         if ( curve == null )
            return;

         // Get the PointPairList
         //第二步:在CurveItem中访问PointPairList(或者其它的IPointList),根据自己的需要增加新数据或修改已存在的数据
         IPointListEdit list = curve.Points as IPointListEdit;
         // If this is null, it means the reference at curve.Points does not
         // support IPointListEdit, so we won't be able to modify it
         if ( list == null )
            return;

         // Time is measured in seconds
         double time = (Environment.TickCount - tickStart) / 1000.0;

         // 3 seconds per cycle
         list.Add( time, Math.Sin( 2.0 * Math.PI * time / 3.0 ) );

         // Keep the X scale at a rolling 30 second interval, with one
         // major step between the max X value and the end of the axis
         Scale xScale = zedGraphControl1.GraphPane.XAxis.Scale;
         if ( time > xScale.Max - xScale.MajorStep )
         ...{
            xScale.Max = time + xScale.MajorStep;
            xScale.Min = xScale.Max - 30.0;
         }

         // Make sure the Y axis is rescaled to accommodate actual data
         //第三步:调用ZedGraphControl.AxisChange()方法更新X和Y轴的范围
         zedGraphControl1.AxisChange();
         // Force a redraw
         //第四步:调用Form.Invalidate()方法更新图表
         zedGraphControl1.Invalidate();
      }

      private void Form1_Resize( object sender, EventArgs e )
      ...{
         SetSize();
      }

      // Set the size and location of the ZedGraphControl
      private void SetSize()
      ...{
         // Control is always 10 pixels inset from the client rectangle of the form
         Rectangle formRect = this.ClientRectangle;
         formRect.Inflate( -10, -10 );

         if ( zedGraphControl1.Size != formRect.Size )
         ...{
            zedGraphControl1.Location = formRect.Location;
            zedGraphControl1.Size = formRect.Size;
         }
      }
   }
}

 

本文作者:佚名 来源:本站原创
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读