Search code examples
c#winformsmschart

How to set minimum and maximum values for date time chart using c#?


I am trying to plot a line chart with real time data for every one second in my windows application. For that I need to set minimum (0 seconds) and maximum (10 minutes) values for the chart . After 10 minutes, minimum value is 10 minutes and maximum value is 20 minutes. So I have to display,10 minutes data every time. I need to display previous data with scrollbar from the very beginning. I tried the following code but I am unable to set the min and max value of chart.Please solve my problem.

   series1.XValueType = ChartValueType.DateTime;
   series1.IsXValueIndexed = true;
   series1.YAxisType = AxisType.Primary;
   series1.ChartType = SeriesChartType.Line;           
   this.chart1.Series.Add(series1);    

   series2.XValueType = ChartValueType.DateTime;
   series2.IsXValueIndexed = true;
   series2.YAxisType = AxisType.Secondary;
   series2.ChartType = SeriesChartType.Line;
   this.chart1.Series.Add(series2);

   chart1.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss";
    chart1.ChartAreas[0].CursorX.IntervalType = DateTimeIntervalType.Seconds;

   chart1.ChartAreas[0].CursorX.AutoScroll = true;
   chart1.ChartAreas[0].CursorY.AutoScroll = true;

   chart1.ChartAreas[0].AxisX.ScrollBar.Size = 15;
   chart1.ChartAreas[0].AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.All;
   chart1.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = false;
   chart1.ChartAreas[0].AxisX.ScrollBar.Enabled = true;

   chart1.ChartAreas[0].AxisX.ScaleView.Zoomable = true;
   chart1.ChartAreas[0].AxisY.ScaleView.Zoomable = true;
   chart1.ChartAreas[0].AxisY2.ScaleView.Zoomable = true;

   chart1.ChartAreas[0].CursorX.IsUserEnabled = true;
   chart1.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;

   DateTime minValue, maxValue;
   minValue = DateTime.Now;
   maxValue = minValue.AddSeconds(600);

   chart1.ChartAreas[0].AxisX.Minimum = minValue.ToOADate();
   chart1.ChartAreas[0].AxisX.Maximum = maxValue.ToOADate();
   chart1.ChartAreas[0].AxisX.ScaleView.Zoom(chart1.ChartAreas[0].AxisX.Minimum, chart1.ChartAreas[0].AxisX.Maximum);  

Solution

  • Finally I found solution for my problem with little bit modifications for the code.Thanks for your support.I implemented a line chart with two series and the chart has to display 1 minute data in every frame.

        int viewcount=0,count=0,mviewcount=60;
        public void AddData() // executing using thread
        {
            while (true)
            {
                if (flag) // making flag as true by calling timer for every 1sec
                {
                    flag = false;
                    DateTime timeStamp = DateTime.Now;
    
                    double y1 = 0.0;
                    double y2= 0.0;
    
                    y1= gety1(count);
                    y2= gety2(count + 1);
    
                    AddNewPoint(timeStamp, chart1.Series[0], chart1.Series[1], oilvalue, tempvalue);
    
    
                    count++;
                }
                Thread.Sleep(1);
            }
        }
    
       public void AddNewPoint(DateTime timeStamp, System.Windows.Forms.DataVisualization.Charting.Series ptSeries1, System.Windows.Forms.DataVisualization.Charting.Series ptSeries2, double y1, double y2)
        {
            if (this.chart1.InvokeRequired)
            {
                BeginInvoke((Action)(() =>
                {                  
                    this.chart1.Series[0].Points.AddXY(timeStamp.ToOADate(), y1);
                    this.chart1.Series[1].Points.AddXY(timeStamp.ToOADate(), y2);
    
                    if ((count % 60) == 0)
                    {                
                        mviewcount += 60;
                        viewcount += 60;
    
                        chart1.ChartAreas[0].AxisX.Minimum = DateTime.FromOADate(ptSeries1.Points[count - 1].XValue).ToOADate(); 
                        chart1.ChartAreas[0].AxisX.Maximum = DateTime.FromOADate(ptSeries1.Points[count - 1].XValue).AddMinutes(1).ToOADate();                        
                        min = chart1.ChartAreas[0].AxisX.Minimum;
                        max = chart1.ChartAreas[0].AxisX.Maximum;                       
                    }
    
                    if (count >= 60)
                    {
                        if ((count >= viewcount) || (count <= mviewcount))
                        {                        
                            chart1.Series[0].Points[0].AxisLabel = System.DateTime.FromOADate(chart1.Series[0].Points[count - 1].XValue).ToString();
                            chart1.ChartAreas[0].AxisX.ScaleView.Position = max;
                        }
                    }                    
    
                    chart1.Update();
                    chart1.ChartAreas[0].RecalculateAxesScale();
    
                }));
            }
        }