简体   繁体   中英

Microsoft Chart Control: MultiSeries and zoom

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms.DataVisualization.Charting;
    using System.Windows.Forms;
    using System.Drawing;
    using System.Threading;
    namespace testC
    {
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }`


        Random rand = new Random();
        Random random = new Random();

        private void Form1_Load(object sender, EventArgs e)
        {

            Chart crt = this.chart1;

            //первый график ==================================================

            ChartArea chartArea = new ChartArea();

            chartArea.Name = "Main";
            ///
            chartArea.AxisY.IsStartedFromZero = false; 
            ///// join other charts ////
            chartArea.InnerPlotPosition.Auto = true;
            /////  Scroll  ///// 
            chartArea.CursorX.IsUserEnabled = true;
            chartArea.CursorX.IsUserSelectionEnabled = true;

            chartArea.AxisX.ScaleView.Zoomable = true;
            chartArea.AxisX.ScrollBar.IsPositionedInside = true;
            ////  Style  ////
            chartArea.AxisX.LineColor = Color.Gray;
            chartArea.AxisX.MajorGrid.LineDashStyle = ChartDashStyle.Dash;
            chartArea.AxisX.MajorGrid.LineColor = Color.Gray;
            chartArea.AxisY.LineColor = Color.Gray;
            chartArea.AxisY.MajorGrid.LineDashStyle = ChartDashStyle.Dash;
            chartArea.AxisY.MajorGrid.LineColor = Color.Gray;


             crt.ChartAreas.Add(chartArea);


             Legend L = new Legend("Main");
             L.DockedToChartArea = "Main";
             L.Alignment = StringAlignment.Near;
             L.Docking = Docking.Top;
             L.IsDockedInsideChartArea = true;

             crt.Legends.Add(L);

             Series S = new Series("Main");

            S.IsXValueIndexed = true;
            S.ChartArea = "Main";
            S.Legend = "Main";
            S.ChartType = SeriesChartType.Line;
            S.Color = Color.Red;
            S.XValueType = ChartValueType.DateTime;

            crt.Series.Add(S);


            //// Line1 график ========================

            /**/ String SeriesName = "Line1";

            Series v = new Series(SeriesName);

            //v.IsXValueIndexed = true;
            v.ChartArea = "Main";
            v.Legend = "Main";
            v.ChartType = SeriesChartType.Line;
            v.Color = Color.Blue;
            v.LegendToolTip = SeriesName;
            v.LegendText = SeriesName;
            v.XValueType = ChartValueType.DateTime;

            crt.Series.Add(v);

            Thread myThread = new Thread(new ThreadStart(FillData));
            myThread.Name = "TestChartin in Thread";
            myThread.Start(); 


        }





        private void FillData()
        {

            for (int day = 1; day <= 90; day++)
            {

                    AddPoint("Line1", day, random.Next(8000, 8200));
                    AddPoint("Main", day, random.Next(8000, 8200));
            }

        }


        public bool AddPoint(string series, double time, double P)
        {
            chart1.InvokeIfNeeded(() =>
            { 

                chart1.Series[series].Points.AddXY(time, P);

            });

            return true;

        }

    }
}

Who knows how to build a multiseries chart on one chartaraes? The above code works only if I ran with one serias (the Main) but when I run with two series (the main and the Line1) this program crashes.

addendum about zoom: when I make zoom in or a value climbs above the upper chart border, Y scale of chart doesn't change automatically.

Question: How do set up automatical Y scale of chart?

Your code crashes because you are tying to set the 2nd Series' Legend to a non-exisiting Legend.

Compare your code here:

 String SeriesName = "Line1";
 ..
 v.Legend = SeriesName;

to what you wrote for the 1st series:

 Legend L = new Legend("Main");
 ..
 S.Legend = "Main";

You have chosen "Main" as the Name of your Legend so you can use it.

All you need to do is set it to the same Legend , as it should be:

 v.Legend = L.Name;

Also note that you didn't clear the default Legend and ChartArea in code. Maybe you did it in the designer? Thsese are the two lines the code would need to do it, they belong before all others:

crt.Legends.Clear(L);
crt.ChartAread.Clear(L);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM