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