Automatic Updates
This example uses the LineSeries class but it works the same for any series in the library
Code behind
using System;
using System.Collections.ObjectModel;
using System.Windows.Forms;
using LiveChartsCore;
using LiveChartsCore.Defaults;
using LiveChartsCore.SkiaSharpView;
using LiveChartsCore.SkiaSharpView.WinForms;
namespace WinFormsSample.Lines.AutoUpdate;
public partial class View : UserControl
{
private readonly CartesianChart _cartesianChart;
private readonly ObservableCollection<ISeries> _seriesCollection;
private readonly ObservableCollection<ObservableValue> _juanaValues;
private readonly Random _random = new();
public View()
{
InitializeComponent();
Size = new System.Drawing.Size(100, 100);
_juanaValues = new ObservableCollection<ObservableValue>
{
new(2), new(5), new(4)
};
_seriesCollection = new ObservableCollection<ISeries>
{
new LineSeries<ObservableValue>
{
Name = "Juana",
Values = _juanaValues
},
new LineSeries<ObservableValue>
{
Name = "Mary",
Values = new ObservableCollection<ObservableValue> { new(5), new(4), new(1) }
}
};
_cartesianChart = new CartesianChart
{
Series = _seriesCollection,
Location = new System.Drawing.Point(0, 50),
Size = new System.Drawing.Size(100, 50),
Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Bottom
};
Controls.Add(_cartesianChart);
var b1 = new Button { Text = "Add item", Location = new System.Drawing.Point(0, 0) };
b1.Click += (sender, e) => { AddItem(); };
Controls.Add(b1);
var b2 = new Button { Text = "Replace item", Location = new System.Drawing.Point(80, 0) };
b2.Click += (sender, e) => { ReplaceItem(); };
Controls.Add(b2);
var b3 = new Button { Text = "Remove item", Location = new System.Drawing.Point(160, 0) };
b3.Click += (sender, e) => { RemoveItem(); };
Controls.Add(b3);
var b4 = new Button { Text = "Add series", Location = new System.Drawing.Point(240, 0) };
b4.Click += (sender, e) => { AddSeries(); };
Controls.Add(b4);
var b5 = new Button { Text = "Remove series", Location = new System.Drawing.Point(320, 0) };
b5.Click += (sender, e) => { RemoveSeries(); };
Controls.Add(b5);
}
private void AddSeries()
{
_seriesCollection.Add(
new LineSeries<ObservableValue>
{
Name = $"User #{_seriesCollection.Count}",
Values = FetchValues()
});
}
private void RemoveSeries()
{
if (_seriesCollection.Count <= 1) return;
_seriesCollection.RemoveAt(_seriesCollection.Count - 1);
}
private void AddItem()
{
var newPoint = new ObservableValue { Value = _random.Next(0, 10) };
_juanaValues.Add(newPoint);
}
private void RemoveItem()
{
if (_juanaValues.Count < 2) return;
_juanaValues.RemoveAt(0);
}
private void ReplaceItem()
{
if (_juanaValues.Count < 2) return;
var randomIndex = _random.Next(0, _juanaValues.Count - 1);
_juanaValues[randomIndex] = new ObservableValue(_random.Next(1, 10));
}
private ObservableCollection<ObservableValue> FetchValues()
{
return new ObservableCollection<ObservableValue>
{
new(_random.Next(0, 10)),
new(_random.Next(0, 10)),
new(_random.Next(0, 10))
};
}
}