2011-08-17 1 views
5

私はこのコードを持っている:1秒ごとに更新されているグラフの最後の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イベントであると私はポイント数がMAX_POINTSを(達したときにポイントを追加し続けると、すべてのtick.Iそれを更新する必要があります10)最初のポイントを削除し、最後にを追加します。

問題はMAX_POINTSに達し、最後にポイントの削除を開始し、グラフが自動スクロールしないことです。すべてのポイントが削除され、新しいポイントが追加されません。

私が助けて、私が言ったようにチャートを変更する必要があると言ってください。

編集1:私はWindowsフォームを使用しています。

EDIT 2:AddXYとRemoveAtはポイントコレクションのものではありません。

編集3:「範囲」を持って、過去1時間、最後の1週間、または最後の1ヶ月のデータを確認する方法も知りたい。

EDIT 4:私は少し、私は今、最後の時間からのポイントを表示するには、チャートを拡大したい私の質問/日

+0

これはWinFormsまたはWPFを使用していますか? WPFでは、ObservableCollection にDataBindingを使用できます。したがって、UI(コレクションのみ)の更新について心配する必要はありません。 –

+0

Collection/Listクラスを自分で実装しているかどうかは分かりますか?またはRemoveAtは、AddXY()とともに独自の実装ですか? – sll

+0

@sllev彼らはポイントコレクションからのもので、私はデフォルトチャートシリーズadnポイントクラスに何も変更していません。 – 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); 

たり、特定のポイント(あなたは1分前からポイントをしたいと言うことができます)

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

またはあなたを得ることができ項目をループ:

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

辞書を照会するにはどうすればいいですか?試してみてください。しかし、これは最後の1時間/ 1日/月などの点を見る方法にしか答えません。 – Bosak

+0

辞書を照会する方法の例がいくつかあります。必要に応じて、linqでより多くのクエリを実行できます。 –

+0

私はLINQを学んでいません。だから、この 'points.Take(10);'は、最も激しい10点を得て、Enumerableを返すでしょうか? – Bosak

5

あなたはこれを置く必要があります:

chart1.ResetAutoValues(); 

X軸とY軸のスケールを調整する

関連する問題