2016-04-18 16 views
0

Ich versuche, ein Liniendiagramm mit Echtzeitdaten für jede Sekunde in meiner Windows-Anwendung zu plotten. Dafür muss ich minimale (0 Sekunden) und maximale (10 Minuten) Werte für das Diagramm einstellen. Nach 10 Minuten beträgt der minimale Wert 10 Minuten und der maximale Wert 20 Minuten. Also muss ich jedes Mal 10 Minuten Daten anzeigen. Ich muss die vorherigen Daten mit der Bildlaufleiste von Anfang an anzeigen. Ich habe den folgenden Code ausprobiert, aber ich kann den Min- und Max-Wert des Diagramms nicht einstellen. Bitte lösen Sie mein Problem.Wie werden die minimalen und maximalen Werte für das Datum-Zeit-Diagramm mit C# festgelegt?

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); 
+0

Was ist das Verhalten mit diesem Code? Was läuft falsch? – niksofteng

+0

@nikhil: Ich kann den minimalen und maximalen Bereich für Datetime-Chart mit Echtzeitdaten nicht festlegen. –

+0

Ist dieses MS-Chart-Steuerelement in WinForm? – qxg

Antwort

0

Schließlich fand ich Lösung für mein Problem mit wenigen Änderungen für die code.Thanks für Ihre support.I ein Liniendiagramm mit zwei in Serie umgesetzt und das Diagramm hat 1-Minuten-Daten in jedem Frame angezeigt werden soll.

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(); 

      })); 
     } 
    } 
1

Microsoft hat ein Beispielprojekt für sie mscharts gefunden here gemacht. Im Bereich Mit Daten arbeiten gibt es einen Abschnitt Echtzeitdaten. Sie haben ein interaktives Beispiel für das, was Sie fragen. Ich habe den folgenden Code zur Vereinfachung kopiert. Hoffentlich hilft das.

using System.Windows.Forms.DataVisualization.Charting; 
... 
private Thread addDataRunner; 
private Random rand = new Random(); 
private System.Windows.Forms.DataVisualization.Charting.Chart chart1; 
public delegate void AddDataDelegate(); 
public AddDataDelegate addDataDel; 
... 

private void RealTimeSample_Load(object sender, System.EventArgs e) 
{ 

    // create the Adding Data Thread but do not start until start button clicked 
    ThreadStart addDataThreadStart = new ThreadStart(AddDataThreadLoop); 
    addDataRunner = new Thread(addDataThreadStart); 

    // create a delegate for adding data 
    addDataDel += new AddDataDelegate(AddData); 

} 

private void startTrending_Click(object sender, System.EventArgs e) 
{ 
    // Disable all controls on the form 
    startTrending.Enabled = false; 
    // and only Enable the Stop button 
    stopTrending.Enabled = true; 

    // Predefine the viewing area of the chart 
    minValue = DateTime.Now; 
    maxValue = minValue.AddSeconds(120); 

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

    // Reset number of series in the chart. 
    chart1.Series.Clear(); 

    // create a line chart series 
    Series newSeries = new Series("Series1"); 
    newSeries.ChartType = SeriesChartType.Line; 
    newSeries.BorderWidth = 2; 
    newSeries.Color = Color.OrangeRed; 
    newSeries.XValueType = ChartValueType.DateTime; 
    chart1.Series.Add(newSeries);  

    // start worker threads. 
    if (addDataRunner.IsAlive == true) 
    { 
     addDataRunner.Resume(); 
    } 
    else 
    { 
     addDataRunner.Start(); 
    } 

} 

private void stopTrending_Click(object sender, System.EventArgs e) 
{ 
    if (addDataRunner.IsAlive == true) 
    { 
     addDataRunner.Suspend(); 
    } 

    // Enable all controls on the form 
    startTrending.Enabled = true; 
    // and only Disable the Stop button 
    stopTrending.Enabled = false; 
} 

/// Main loop for the thread that adds data to the chart. 
/// The main purpose of this function is to Invoke AddData 
/// function every 1000ms (1 second). 
private void AddDataThreadLoop() 
{ 
    while (true) 
    { 
     chart1.Invoke(addDataDel); 

     Thread.Sleep(1000); 
    } 
} 

public void AddData() 
{ 
    DateTime timeStamp = DateTime.Now; 

    foreach (Series ptSeries in chart1.Series) 
    { 
     AddNewPoint(timeStamp, ptSeries); 
    } 
} 

/// The AddNewPoint function is called for each series in the chart when 
/// new points need to be added. The new point will be placed at specified 
/// X axis (Date/Time) position with a Y value in a range +/- 1 from the previous 
/// data point's Y value, and not smaller than zero. 
public void AddNewPoint(DateTime timeStamp, System.Windows.Forms.DataVisualization.Charting.Series ptSeries) 
{ 
    double newVal = 0; 

    if (ptSeries.Points.Count > 0) 
    { 
     newVal = ptSeries.Points[ptSeries.Points.Count -1 ].YValues[0] + ((rand.NextDouble() * 2) - 1); 
    } 

    if (newVal < 0) 
     newVal = 0; 

    // Add new data point to its series. 
    ptSeries.Points.AddXY(timeStamp.ToOADate(), rand.Next(10, 20)); 

    // remove all points from the source series older than 1.5 minutes. 
    double removeBefore = timeStamp.AddSeconds((double)(90) * (-1)).ToOADate(); 
    //remove oldest values to maintain a constant number of data points 
    while (ptSeries.Points[0].XValue < removeBefore) 
    { 
     ptSeries.Points.RemoveAt(0); 
    } 

    chart1.ChartAreas[0].AxisX.Minimum = ptSeries.Points[0].XValue; 
    chart1.ChartAreas[0].AxisX.Maximum = DateTime.FromOADate(ptSeries.Points[0].XValue).AddMinutes(2).ToOADate(); 

    chart1.Invalidate(); 
} 

/// Clean up any resources being used. 
protected override void Dispose(bool disposing) 
{ 
    if ((addDataRunner.ThreadState & ThreadState.Suspended) == ThreadState.Suspended) 
    { 
     addDataRunner.Resume(); 
    } 
    addDataRunner.Abort(); 

    if(disposing) 
    { 
     if (components != null) 
     { 
      components.Dispose(); 
     } 
    } 
    base.Dispose(disposing); 
}   
... 
+0

Entschuldigung für die späte Antwort. Es funktioniert, aber ich möchte meine vorherigen Daten nicht entfernen. Ich muss vorherige Daten mit Bildlaufleiste von Anfang an anzeigen. –

+1

Entfernen Sie in der AddNewPoint() - Funktion nur den Code, der die alten Daten durchläuft und entfernt. Entfernen Sie den folgenden Code: '// Entfernen Sie alle Punkte aus der Quellenserie älter als 1,5 Minuten. double removeBefore = timeStamp.AddSeconds ((doppelt) (90) * (-1)). ToOADate(); // Entfernen der ältesten Werte, um eine konstante Anzahl von Datenpunkten zu erhalten while (ptSeries.Points [0] .XValue Baddack

+0

Vielen Dank, es funktioniert gut. Aber es zeigt Achsenbeschriftungen für nur 0-10 Minuten Daten. So zeigen Sie Beschriftungen für alle Instanzen an. –

Verwandte Themen