# C# und ASP.Net - Stacked Chart - X-Achse als DateTime



## Grimsey (7 März 2019)

Hallo zusammen,

ich möchte für unsere Maschinen im Werk gerne eine Art Zustandsanzeige erstelle, ähnlich wie auf dem Bild im Anhang (Zustandsanzeige).
Von den Maschinen werden zur Zeit diverse Parameter erfasst und in einer MSSQL-Datenbank gespeichert und auf einer firmeninternen Website dargestellt.
Anhand des Parameters "Geschwindigkeit" ermittle ich mir bereits, ob eine Maschine stillsteht oder produziert. Die so ermittelten Zeitspannen stelle ich in einem Diagramm dar (Zustandsanzeige-IST).

Ich würde nun gerne noch die Beschriftung der X-Achse dahingehend anpassen, dass z.B. Datum und Uhrzeit für den angezeigten Bereich dargestellt werden, so dass man eine Zuordnung des Zeitraumes von Produktion und Stillstand treffen kann.

Aber irgendwie scheint es nicht zu funktionieren. Ich bekomme als Beschriftung immer Werte in der Form "00.00.00" angezeigt.


```
[LIST=1]
[*][COLOR=blue]protected[/COLOR] [COLOR=blue]void[/COLOR] Button1_Click([COLOR=blue]object[/COLOR] sender, EventArgs e)
[*]        {
[*]            [COLOR=blue]int[/COLOR] i [COLOR=green]=[/COLOR] [COLOR=darkorange]0[/COLOR];
[*]            DateTime dtStart;
[*]            TimeSpan dauerStillstand [COLOR=green]=[/COLOR] TimeSpan.Zero;
[*]            TimeSpan dauerProduktion [COLOR=green]=[/COLOR] TimeSpan.Zero;
[*]            ChartTest.Series.Clear();
[*]            [COLOR=blue]foreach[/COLOR] (DataRow dr [COLOR=blue]in[/COLOR] ds2.Tables[[COLOR=darkorange]0[/COLOR]].Rows)
[*]            {
[*]                [COLOR=blue]string[/COLOR] str [COLOR=green]=[/COLOR] dr.ItemArray[[COLOR=darkorange]1[/COLOR]].ToString(); [COLOR=green]// Zeitstempel[/COLOR]
[*]                dtStart [COLOR=green]=[/COLOR] DateTime.Parse(str);
[*]                [COLOR=blue]double[/COLOR] Geschwindigkeit [COLOR=green]=[/COLOR] Convert.ToDouble(dr.ItemArray[[COLOR=darkorange]5[/COLOR]]); [COLOR=green]// Geschwindigkeit[/COLOR]
[*]                [COLOR=blue]if[/COLOR] (Geschwindigkeit [COLOR=green]<[/COLOR][COLOR=green]=[/COLOR] [COLOR=darkorange]0[/COLOR])
[*]                {
[*]                    i[COLOR=green]+[/COLOR][COLOR=green]+[/COLOR];
[*]                    ChartTest.Series.[COLOR=blue]Add[/COLOR]([COLOR=red]"Stopp"[/COLOR] [COLOR=green]+[/COLOR] i.ToString());
[*]                    ChartTest.Series[[COLOR=red]"Stopp"[/COLOR] [COLOR=green]+[/COLOR] i.ToString()].ChartType [COLOR=green]=[/COLOR] SeriesChartType.StackedBar;
[*]                    ChartTest.Series[[COLOR=red]"Stopp"[/COLOR] [COLOR=green]+[/COLOR] i.ToString()].YValueType [COLOR=green]=[/COLOR] ChartValueType.Time;
[*]                    ChartTest.Series[[COLOR=red]"Stopp"[/COLOR] [COLOR=green]+[/COLOR] i.ToString()].Points.AddXY([COLOR=red]"Konti2"[/COLOR], dtStart);
[*]                    ChartTest.Series[[COLOR=red]"Stopp"[/COLOR] [COLOR=green]+[/COLOR] i.ToString()].Color [COLOR=green]=[/COLOR] Color.Red;
[*]                }
[*]                [COLOR=blue]else[/COLOR]
[*]                {
[*]                    i[COLOR=green]+[/COLOR][COLOR=green]+[/COLOR];
[*]                    ChartTest.Series.[COLOR=blue]Add[/COLOR]([COLOR=red]"Läuft"[/COLOR] [COLOR=green]+[/COLOR] i.ToString());
[*]                    ChartTest.Series[[COLOR=red]"Läuft"[/COLOR] [COLOR=green]+[/COLOR] i.ToString()].ChartType [COLOR=green]=[/COLOR] SeriesChartType.StackedBar;
[*]                    ChartTest.Series[[COLOR=red]"Läuft"[/COLOR] [COLOR=green]+[/COLOR] i.ToString()].YValueType [COLOR=green]=[/COLOR] ChartValueType.Time;
[*]                    ChartTest.Series[[COLOR=red]"Läuft"[/COLOR] [COLOR=green]+[/COLOR] i.ToString()].Points.AddXY([COLOR=red]"Konti2"[/COLOR], dtStart);
[*]                    ChartTest.Series[[COLOR=red]"Läuft"[/COLOR] [COLOR=green]+[/COLOR] i.ToString()].Color [COLOR=green]=[/COLOR] Color.Lime;
[*]                }
[*]            }
[*]            ChartTest.ChartAreas[[COLOR=darkorange]0[/COLOR]].AxisY.LabelStyle.Format [COLOR=green]=[/COLOR] [COLOR=red]"HH.mm.ss"[/COLOR];
[*]            ChartTest.ChartAreas[[COLOR=darkorange]0[/COLOR]].AxisY.LabelStyle.Angle [COLOR=green]=[/COLOR] [COLOR=darkorange]45[/COLOR];
[*]        }
[*]
[/LIST]
```

Hat hier vielleicht noch jemand eine Idee, wie das korrekt einstellen kann?

Habt vielen Dank im Voraus!


----------



## Grimsey (8 März 2019)

Ich habe einen Weg gefunden, die Daten in dem gewünschten Format darzustellen.


```
protected void Button1_Click(object sender, EventArgs e)
        {            
            List<DateTime> lstStillstand = new List<DateTime>();
            List<DateTime> lstProduktion = new List<DateTime>();
           
            double Geschwindigkeit;
            double dblZeit;
            string SerienName;
            string SerieAnfang;
            string Anlage = "Konti2";
            DateTime dtStart;
            DateTime dtAnfang;
            DateTime minDate;            
            TimeSpan dauerStillstand = TimeSpan.Zero;
            TimeSpan dauerProduktion = TimeSpan.Zero;


            dtAnfang = DateTime.Parse(ds2.Tables[0].Rows[0].ItemArray[1].ToString());
            SerieAnfang = dtAnfang.ToString();


            ChartTest.Series.Clear();
            
            ChartTest.Series.Add("NullPunkt");
            ChartTest.Series["NullPunkt"].ChartType = SeriesChartType.StackedBar;
            ChartTest.Series["NullPunkt"].Points.AddXY(Anlage, dtAnfang);
      
            minDate = dtAnfang;


            foreach (DataRow dr in ds2.Tables[0].Rows)
            {
                SerienName = dr.ItemArray[1].ToString(); // Zeitstempel
                dtStart = DateTime.Parse(SerienName);
                Geschwindigkeit = Convert.ToDouble(dr.ItemArray[5]); // Geschwindigkeit
                dblZeit = Convert.ToDouble(dtStart.ToOADate());


                if (Geschwindigkeit <= 0)
                {
                    lstStillstand.Add(dtStart);


                    for (int j = 0; j < lstStillstand.Count; j++)
                    {
                        if (j == 0)
                        {
                            dauerStillstand = TimeSpan.Zero;
                        }
                        else
                        {
                            dauerStillstand = lstStillstand[j] - lstStillstand[j - 1];
                        }                       
                    }


                    ChartTest.Series.Add(SerienName);
                    ChartTest.Series[SerienName].ChartType = SeriesChartType.StackedBar;                                      
                    ChartTest.Series[SerienName].Points.AddXY(Anlage, dauerStillstand.TotalDays);
                    ChartTest.Series[SerienName].Color = Color.Red;
                }
                else
                {
                    lstProduktion.Add(dtStart);


                    for (int j = 0; j < lstProduktion.Count; j++)
                    {
                        if (j == 0)
                        {
                            dauerProduktion = TimeSpan.Zero;
                        }
                        else
                        {
                            dauerProduktion = lstProduktion[j] - lstProduktion[j - 1];
                        }                        
                    }


                    ChartTest.Series.Add(SerienName);
                    ChartTest.Series[SerienName].ChartType = SeriesChartType.StackedBar;                                        
                    ChartTest.Series[SerienName].Points.AddXY(Anlage, dauerProduktion.TotalDays);
                    ChartTest.Series[SerienName].Color = Color.Lime;
                }
            }


            ChartTest.ChartAreas[0].AxisY.LabelStyle.Format = "HH:mm";
            ChartTest.ChartAreas[0].AxisY.LabelStyle.Angle = 45;
            ChartTest.ChartAreas[0].AxisY.Minimum = minDate.ToOADate();
        }
```

Der Knackpunkt war, dass ich erst eine Serie "NullPunkt" hinzugefügt habe, die nur einen Punkt besitzt und zwar den 1. Eintrag in der Tabelle.
Weiterhin ist wichtig, dass man "AxisY.Minimum" ebenfalls auf diesen Wert einstellt.
Als zweites habe ich erkannt, dass in der so vorgenommenen Einstellung, weitere Punkte in den hinzukommenden Serie scheinbar als ganze Tage interpretiert werden. Also habe ich die Werte in ".TotalDays" umgerechnet.

Damit habe ich das gewünschte Ergebnis erst einmal erreicht.

Was noch zu tun wäre:
die Ermittlung der Produktions- und Stillstandsdauer erfolgt jeweils über eine FOR-Schleife, was doch recht lange dauert. Eigentlich benötigt man nur immer die Punkte, bei denen ein Zustandswechsel (stopp => run; run => stopp) stattfindet.
Dies möchte ich jetzt noch optimieren.


----------

