Laden...

Wie kann ich Messwerte aus einer Access-DB als Chart anzeigen lassen?

Erstellt von Dumpfbacke vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.080 Views
D
Dumpfbacke Themenstarter:in
11 Beiträge seit 2016
vor 4 Jahren
Wie kann ich Messwerte aus einer Access-DB als Chart anzeigen lassen?

Hallo,

ich habe eine Accessdatenbank mit zwei Messwerten.
Die Messwerte aus der Datenbank sollen in einem chart angezeigt werden.

Das Ganze sieht bei mir so aus:

 private void buttonSqlAbfrage_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;

            DateTime _d1 = DateTime.Parse("13.05.2019 08:35:56");   // von
            DateTime _d2 = DateTime.Parse("13.05.2019 08:45:34");   // bis  
            OleDbCommand cmd = new OleDbCommand();
            cmd.CommandText = "SELECT * FROM Table1 where zeitstempel >= ? AND zeitstempel <= ?";
            cmd.Parameters.AddWithValue("von", _d1);
            cmd.Parameters.AddWithValue("bis", _d2);
            cmd.Connection = con;
            OleDbDataReader myReader = cmd.ExecuteReader();

            while (myReader.Read())
            {
                //...chart
                chart1.ChartAreas[0].AxisX.LabelStyle.Format = "dd.MM.yyyy HH:mm:ss";

                chart1.Series[0].Enabled = true;
                chart1.Series[0].Points.DataBindXY(myReader, "zeitstempel", myReader, "var1");
                chart1.Series[0].ChartType = SeriesChartType.Line;
                chart1.Series[0].YValueType = ChartValueType.Auto;
                chart1.Series[0].XValueType = ChartValueType.DateTime;
                chart1.Series[0].Name = "var1";
                chart1.Series[0].Color = Color.Aqua;

                chart1.Series[1].Enabled = true;
                chart1.Series[1].Points.DataBindXY(myReader, "zeitstempel", myReader, "var2");
                chart1.Series[1].ChartType = SeriesChartType.Line;
                chart1.Series[1].YValueType = ChartValueType.Auto;
                chart1.Series[1].XValueType = ChartValueType.DateTime;
                chart1.Series[1].Name = "var2";
                chart1.Series[1].Color = Color.Red;
            }
            Cursor = Cursors.Default;
        }

Bei mir wird immer nur die erste Series gezeichnet. Was mache ich hier falsch?
Und warum muss das zeichnen in einer der whileschleife vom reader machen....?

Danke, Dumpfbacke

2.298 Beiträge seit 2010
vor 4 Jahren

Hallo,

Bei mir wird immer nur die erste Series gezeichnet. Was mache ich hier falsch?

Hierfür wäre die Definition der Series relevant und wie denn das Ergebnis aussieht.


Und warum muss das zeichnen in einer der whileschleife vom reader machen....?

Möglicherweise kommst du besser, wenn du das Ergebnis in ein DataTable einliest. Dies kannst du dann an die Chart binden. Aktuell fügst du ja quasi jeden Punkt einzeln hinzu. Im übrigen musst du keine Schleife dafür erstellen. Du kannst direkt ohne Umwege deine Series mit BindXY füllen ganz ohne Schleife.

Probier mal folgendes:


            chart1.DataSource = myReader;

            chart1.Series[0].Enabled = true;
            chart1.Series[0].XValueMember = "zeitstempel";
            chart1.Series[0].YValueMembers = "var1";
            chart1.Series[0].ChartType = SeriesChartType.Line;
            chart1.Series[0].YValueType = ChartValueType.Auto;
            chart1.Series[0].XValueType = ChartValueType.DateTime;
            chart1.Series[0].Name = "var1";
            chart1.Series[0].Color = Color.Aqua;

            chart1.Series[1].Enabled = true;
            chart1.Series[1].XValueMember = "zeitstempel";
            chart1.Series[1].YValueMembers = "var2";
            chart1.Series[1].ChartType = SeriesChartType.Line;
            chart1.Series[1].YValueType = ChartValueType.Auto;
            chart1.Series[1].XValueType = ChartValueType.DateTime;
            chart1.Series[1].Name = "var2";
            chart1.Series[1].Color = Color.Red;

            chart1.DataBind();

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

D
Dumpfbacke Themenstarter:in
11 Beiträge seit 2016
vor 4 Jahren

Hallo,

du hasst recht das funktioniert auch ausserhalb der whileschleife...

grundsätzilch habe ich eine accessdatenbank mit 8 Feldern.
Im ersten Feld steht der Zeitstempel (X Achse).
In den anderen 7 Feldern stehen die Messwerte (Y Achsen der einzelnen Series).

Zusätzlich möchte ich nicht immer alle Series anzeigen, das heisst es müssen nicht immer alle Messwerte im Chart gezeichnet werden.

Was wäre dafür der "richtigste" Ansatz?

Danke, mfg Dumpfbacke

2.298 Beiträge seit 2010
vor 4 Jahren

Hallo,

ich hatte meinen Beitrag noch einmal editiert. Bezüglich dem Ein- / Ausblenden von Series kannst du ja die "Enabled"-Eigenschaft verwenden. Wenn eine Series nicht sichtbar sein soll, setzt du Enabled halt einfach auf false.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

D
Dumpfbacke Themenstarter:in
11 Beiträge seit 2016
vor 4 Jahren

Databinding über den reader so wie du es vorschlägst funktioniert!

Super, Danke!

mfg Dumpfbacke