Как просмотреть последние 10 точек данных в диаграмме, которая обновляется каждую секунду? - PullRequest
5 голосов
/ 17 августа 2011

У меня есть этот код:

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 Forms.

РЕДАКТИРОВАТЬ 2: AddXY и RemoveAt не мои, они из коллекции точек.

РЕДАКТИРОВАТЬ 3: Я также хочу знать, как получить «область» и увидеть данные за последниечас или за последнюю неделю или за последний месяц.

РЕДАКТИРОВАТЬ 4: Я немного изменил свой вопрос, теперь я хочу масштабировать график, чтобы показать точки за последний час / день

Ответы [ 2 ]

9 голосов
/ 19 августа 2011

Храните точки в отдельном словаре, а также на графике.Затем вы можете просто запросить словарь, когда вам нужны последние точки.

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

, а затем добавить эту строку сразу после вашего звонка на AddXY():

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

и, если хотите,чтобы синхронизировать словарь с диаграммой, удалите также первый элемент из словаря:

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

Чтобы запросить словарь, вы можете использовать linq: Take () 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;
}
5 голосов
/ 12 сентября 2012

Вы должны поставить это:

chart1.ResetAutoValues();

для настройки шкалы оси X и Y

...