Как просмотреть последние 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();
    }

Эта часть моего кода является тиковым событием таймера, когда я рисую график, и мне нужно обновлять его каждый тик. Я продолжаю добавлять точки, и когда количество очков достигает MAX_POINTS(10), оно удаляет первую точку и добавляет новую в конец.

Проблема в том, что когда он достигает MAX_POINTS, он начинает удалять точки в конце, а график не выполняет автопрокрутку. Все очки удаляются и новые очки не добавляются.

Пожалуйста, помогите мне и скажите, что мне нужно, чтобы диаграмма работала, как я сказал.

РЕДАКТИРОВАТЬ 1: я использую Windows Forms.

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

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

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

2 ответа

Решение

Сохраните точки в отдельном словаре, а также в диаграмме. Тогда вы можете просто запросить словарь, когда вы хотите самые последние точки.

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

или вы можете получить конкретную точку (скажем, вы хотите точку с минуту назад)

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

или вы можете перебрать элементы:

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

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

chart1.ResetAutoValues();

настроить шкалу оси X и Y

Другие вопросы по тегам