"Red X of Doom" when plotting time series in WinForm

I am trying to build multiple time series data. I based my code on the accepted answer here:

A chart that creates dynamically. in.net, C #

However, I draw data for several temporary data that may come from different sources, which I designated as "tags."

After two calls to AddXY from different sources, I get a big red X, but I can not determine why this is so. My code is below, as well as the image of the big red X, if that is ambiguous, what I'm talking about.

It may be worth noting that I enter the console application and dynamically create WinForm.

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization;
using System.Windows.Forms.DataVisualization.Charting;

namespace MyApplication
{
    public class ChartForm : Form
    {
        private System.ComponentModel.IContainer components = null;
        System.Windows.Forms.DataVisualization.Charting.Chart chart1;
        System.Windows.Forms.DataVisualization.Charting.Series series1;
        ConcurrentDictionary<string, System.Windows.Forms.DataVisualization.Charting.Series> tagToSeriesDict;
        Random r = new Random();

        public ChartForm()
        {
            InitializeComponent();

        }
        private void Form1_Load(object sender, EventArgs e)
        {
            this.tagToSeriesDict = new ConcurrentDictionary<string, System.Windows.Forms.DataVisualization.Charting.Series>();
            chart1.Series.Clear();
        }

        [MethodImpl(MethodImplOptions.Synchronized)]
        public void addPoint(string tag, double x, double y)
        {
            if (!tagToSeriesDict.ContainsKey(tag))
            {
                tagToSeriesDict[tag] = new System.Windows.Forms.DataVisualization.Charting.Series
                {
                    Name = tag,
                    Color = System.Drawing.Color.FromArgb((int)(r.NextDouble() * 255), (int)(r.NextDouble() * 255), (int)(r.NextDouble() * 255)),
                    IsVisibleInLegend = false,
                    IsXValueIndexed = true,
                    ChartType = SeriesChartType.Line
                };

                this.chart1.Series.Add(tagToSeriesDict[tag]);
            }

            tagToSeriesDict[tag].Points.AddXY(x, y);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
            System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
            this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart();
            ((System.ComponentModel.ISupportInitialize)(this.chart1)).BeginInit();
            this.SuspendLayout();
            //
            // chart1
            //
            chartArea1.Name = "ChartArea1";
            this.chart1.ChartAreas.Add(chartArea1);
            this.chart1.Dock = System.Windows.Forms.DockStyle.Fill;
            legend1.Name = "Legend1";
            this.chart1.Legends.Add(legend1);
            this.chart1.Location = new System.Drawing.Point(0, 50);
            this.chart1.Name = "chart1";
            // this.chart1.Size = new System.Drawing.Size(284, 212);
            this.chart1.TabIndex = 0;
            this.chart1.Text = "chart1";
            //
            // Form1
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(800, 600);
            this.Controls.Add(this.chart1);
            this.Name = "Form1";
            this.Text = "Chart";
            this.Load += new System.EventHandler(this.Form1_Load);
            ((System.ComponentModel.ISupportInitialize)(this.chart1)).EndInit();
            this.ResumeLayout(false);
        }
    }
}

EDIT: upon request, I added code in which the form is created and in which addPoint is called:

//a static field in the main application:
static ChartForm plot = new ChartForm();

//called once in the constructor of my main application
Application.EnableVisualStyles();
Application.Run(plot); // or whatever

//callback to ObservableConcurrentDictionary called whenever new data comes in:
[MethodImpl(MethodImplOptions.Synchronized)]
    public void onVisibilityChanged(object obj, System.Collections.Specialized.NotifyCollectionChangedEventArgs args)
    {

        KeyValuePair<string, IDistribution> tagAndState = (KeyValuePair<string, IDistribution>)args.NewItems[0];
        string tag = tagAndState.Key;
        double value = (double)tagAndState.Value;




        double now = DateTime.UtcNow.Ticks;
        TicTacToeInteraction.plot.addPoint(tag, now, value);

enter image description here

+4
2

.

, . . :

IsXValueIndexed = false,

true.

+2
addPoint("Tag1", 10, 20);
addPoint("Tag1", 20, 30);
addPoint("Tag1", 30, 40);
addPoint("Tag1", 40, 50);

addPoint("Tag2", 10, 20);
addPoint("Tag2", 20, 70);
addPoint("Tag2", 30, 80);
addPoint("Tag2", 40, 90);

Form1_Load , . main addPoint?

0

All Articles