How to view the last 10 DataPoints in a chart that's updating each second?

匿名 (未验证) 提交于 2019-12-03 00:50:01

问题:

I have this code:

private void timer_Tick(object sender, EventArgs e)     {         timer.Stop();         for (int i = 0; i < TOTAL_SENSORS; i++)         {             DateTime d = DateTime.Now;             devices[i].Value = float.Parse(serialPort.ReadLine());             if (chart1.Series[i].Points.Count > MAX_POINTS)             {                 //see the most recent points             }             chart1.Series[i].Points.AddXY(d, devices[i].Value);         }         timer.Start();     } 

This part of my code is the timer's tick event where i draw a chart and i need to update it every tick.I keep adding points and when the points count reaches MAX_POINTS(10) it removes the first point and adds a new one at the end.

The problem is when it reaches MAX_POINTS it starts removing points at the end and the graph doesn't autoscroll. All points get deleted and no new points get added.

Please help me and say what I need to change the chart to work as I said.

EDIT 1: I am using Windows Forms.

EDIT 2: AddXY and RemoveAt are not mine they are from the points collection.

EDIT 3: I also want to know how to have a 'scope' and see the data for the last hour or for the last week or for the last month.

EDIT 4: I changed my question a bit, I now want to scale the chart to show the points from the last hour/day

回答1:

Store the points in a separate dictionary as well as the chart. Then you can just query the dictionary when you want the most recent points.

Dictionary<DateTime, float> points = new Dictionary<DateTime, float>(); 

then add this line directly after your call to AddXY():

points.Add(d, devices[i].Value); 

and if you want to keep the dictionary in sync with the chart, remove the first element from the dictionary as well:

points.Remove(points.Keys[0]); 

To query the dictionary, you can use linq: Take() Documentation Skip() Documentation

IEnumerable<KeyValuePair<DateTime, float>> mostRecent = points.Skip(points.Count - 10).Take(10); 

or you can get a specific point (lets say you want the point from one minute ago)

float value = points[DateTime.Now.AddMinutes(-1)]; 

or you can loop over the items:

foreach(KeyValuePair<DateTime, float> point in points) {     DateTime time = point.Key;     float value = point.Value; } 


回答2:

You need to put this:

chart1.ResetAutoValues(); 

to adjust X and Y axis scale



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!