2011-08-17 19 views
5

我有這樣的代碼:如何查看每秒更新的圖表中的最後10個數據點?

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(); 
    } 

我的這部分代碼是計時器的滴答事件在那裏我畫一個圖,我需要更新它的每一個tick.I不斷增加點,當點計數達到MAX_POINTS( 10)它刪除第一個點在最後添加一個新點。

問題是,當它達到MAX_POINTS時,它開始在最後刪除點並且圖形不自動滾動。所有點都被刪除,並且沒有新的點被添加。

請幫我說出我需要改變圖表的工作方式,正如我所說的。

編輯1:我正在使用Windows窗體。

編輯2:AddXY和RemoveAt不是我的,他們是從點集合。編輯3:我也想知道如何擁有一個'範圍',並查看最近一小時或上一週或上個月的數據。

編輯4:我改變了我的問題了一下,我現在要縮放的圖表,從最後一小時顯示點/天

+0

這是使用WinForms還是WPF?在WPF中,您可以將DataBinding用於ObservableCollection ,然後您不必擔心更新UI(僅限集合)。 –

+0

我想知道你是否擁有自己的Collection/List類的實現?或RemoveAt這是你自己的實現與AddXY()? – sll

+0

@sllev他們來自點集合,我沒有改變任何東西到默認的圖表系列和點類。 – Bosak

回答

8

存儲在單獨的字典中的點以及圖表。然後,當你想要最近的點時,你可以查詢字典。

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

然後你的電話後直接加入這一行AddXY()

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

,如果你想保持字典同步與圖表,從詞典中刪除第一個元素,以及:

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

要查詢字典,你可以使用LINQ:Take() DocumentationSkip() Documentation

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

,或者你可以得到一個特定的點(可以說你想從一分鐘前的點)

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

,或者你也可以遍歷項目:

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

如何查詢字典嗎?例如請。但這隻回答如何查看從最後一小時/日/月等的點。 – Bosak

+0

有幾個如何查詢字典的例子。如果你願意,你可以用linq做更多的查詢。 –

+0

我仍然沒有學過LINQ。所以這個'points.Take(10)''會得到10個最新點並返回一個Enumerable? – Bosak

5

你需要把這個:

chart1.ResetAutoValues(); 

調整X軸和Y軸刻度

相關問題