5

私はこのコードを持っています:

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

コードのこの部分は、チャートを描画するタイマーのティック イベントであり、ティックごとに更新する必要があります。ポイントを追加し続け、ポイント カウントが MAX_POINTS(10) に達すると、最初のポイントが削除れ、新しいポイントが追加されます終わり。

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

私が言ったようにチャートを変更するために必要なことを教えてください。

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

編集 2: AddXY と RemoveAt は私のものではなく、ポイント コレクションのものです。

編集 3:「スコープ」を設定して、過去 1 時間、先週、または先月のデータを表示する方法も知りたいです。

編集 4: 質問を少し変更しました。グラフをスケーリングして、過去 1 時間/日のポイントを表示したいと思います。

4

2 に答える 2

9

ポイントを別の辞書とチャートに保存します。次に、最新のポイントが必要なときに辞書を照会できます。

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

への呼び出しの直後にこの行を追加しますAddXY()

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

ディクショナリをチャートと同期させたい場合は、ディクショナリから最初の要素も削除します。

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

辞書を照会するには、linq を使用できます。 Take() Documentation Skip() 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;
}
于 2011-08-19T16:49:45.390 に答える
5

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

chart1.ResetAutoValues();

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

于 2012-09-12T11:34:49.573 に答える