Microsoft图表控件:多系列和缩放

本文关键字:系列 缩放 控件 Microsoft | 更新日期: 2023-09-27 17:57:29

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

谁知道如何在一张图表上建立多系列图表?上面的代码只有在我用一个serias(Main(运行时才有效,但当我用两个系列(Main和Line1(运行时,这个程序会崩溃。

关于缩放的附录:当我放大或某个值攀升到图表上边框上方时,图表的Y比例不会自动改变。

问题:如何设置图表的自动Y刻度?

Microsoft图表控件:多系列和缩放

您的代码崩溃,因为您要将第二系列的图例设置为不存在的图例。

在此处比较您的代码:

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

你为第一个系列写的东西:

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

您已选择"Main"作为Legend的名称,因此可以使用它。

您所需要做的就是将其设置为相同的Legend,因为它应该是:

 v.Legend = L.Name;

还要注意,您没有在代码中清除默认的LegendChartArea。也许你是在设计师那里做的?这是代码需要完成的两行代码,它们属于所有其他代码:

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