Autor Beitrag
KlausNeuer
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 21.01.14 12:58 
Hallo an alle Forums Nutzer,

Bin neu hier im Forum und hoffe das dieses Forum mir helfen kann. Ich versuche auch zu helfen wo es geht ;)


Zu meinem Problem.

Ich arbeite seid neustem an dem erstellen eines Chart, das mir Auswertungsergebniss darstellen soll.

Hier mal ein beispiel, dort ist auch mein erstes Problem.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
var s = new Series();
s.ChartType = SeriesChartType.Area;

DateTime time = new DateTime(2014117093020100);
s.Points.AddXY(time.ToOADate(), 1);
DateTime time2 = new DateTime(2014117093030250);
s.Points.AddXY(time2.ToOADate(), 1);
DateTime time3 = new DateTime(2014117093040350);
s.Points.AddXY(time3.ToOADate(), 1);
DateTime time4 = new DateTime(2014117093050550);
s.Points.AddXY(time4.ToOADate(), 1);
//test ende

s.XValueType = ChartValueType.Time;
s.XValueType = ChartValueType.DateTimeOffset;
chart1.ChartAreas[0].AxisX.LabelStyle.Format = "yyyy:MM:dd   HH:mm:ss:fff ";
chart1.Series.Clear();                      //Diagramm löschen clearen                   
chart1.Series.Add(s);                       //alle erstellten Punkte ins diagramm zeichnen


Ich habe hier mal für time und time2 etc. einfach Datumswerte eingetragen.
Später werden diese aus einer Datenbank gefüllt, aber die Struktur bleibt.
Die Zahlen werden somit einfach durch variablen ersetzt.

1. Problem

Wenn ich mir das Testweiße debug dann bekomm ich eine chart angezeigt,
bei der an der X-Achse das Datum steht (2014:01:17 09:30:20:000)

Hier ist das problem das ich einfach nicht die Milisekunden in der Chart angezeigt bekomm.


2. Problem

Später bekomm ich die DateTime werte über eine Datenbank, dort kann es sein, dass ich ein wert an Tag 1 hab und 5 Werte an Tag 2 hab, an Tag 3 hab ich kein Wert und an Tag 4 hab ich 100 Werte.
Ich hoffe ihr versteht was ich mein :)

Ich hab dann ein großes problem bezüglich der skallierung, entweder gehen Zwischenwerte unter, und werden in der chart nur als linie angezeigt, weil sie sich nur im Milisecound bereich unterscheiden.
Oder manche werte sind nicht sichtbar weil sie 3 Tage entfernt von anderen liegen.

danke schonmal!


Bitte verweißt mich nicht nur an die methode etc. und die hilfe von MSDN, ich hab da schon sehr sehr lange drin gewühlt.

Moderiert von user profile iconTh69: Beitragsformatierung überarbeitet.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 21.01.14 14:38 
Hallo und :welcome:

ich nehme mal an, daß die Methode ToOADate() dafür verantwortlich ist, daß keine Millisekunden angezeigt werden.
Kannst ja mal testweise DateTime.FromOADate(time.ToOADate()) aufrufen, ob die Millisekunden erhalten bleiben. Und dann im nächsten Schritt mal einen (selbst zugewiesenen) double-Wert direkt dem Chart mitgeben.

Bei deinem 2. Problem bzgl. Skalierung kann ich dir aber wohl nicht weiterhelfen. Unterstützt das Chart denn keinen Zoom-Modus?

P.S: Und bitte Crossposts myCSharp.de - Forms Chart Darstellung mit DateTime in Millisekunden-Auflösung auf X-Achse entsprechend unserer Richtlinien (3.10 Crosspostings) immer angeben, danke.
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 21.01.14 15:19 
Warum nicht gleich double-Werte dem Chart übergeben und nur im Format dann festlegen, dass die Werte als Datum/Uhrzeit anzuzeigen sind?

Denn letztlich sind Datums/Zeit-Angaben auch nur Fließkommazahlen. Und wenn double nicht ausreichen sollte, dann extended nehmen. Das Gleiche gilt natürlich dann auch für die spätere Datenbank.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 21.01.14 15:47 
Hallo Tranx,

dies ist hier C#, nicht Delphi - und hier gibt es keinen Datentyp 'extended' und daher ist DateTime schon das richtige ;-)
KlausNeuer Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 21.01.14 16:14 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo und :welcome:

ich nehme mal an, daß die Methode ToOADate() dafür verantwortlich ist, daß keine Millisekunden angezeigt werden.
Kannst ja mal testweise DateTime.FromOADate(time.ToOADate()) aufrufen, ob die Millisekunden erhalten bleiben. Und dann im nächsten Schritt mal einen (selbst zugewiesenen) double-Wert direkt dem Chart mitgeben.

Bei deinem 2. Problem bzgl. Skalierung kann ich dir aber wohl nicht weiterhelfen. Unterstützt das Chart denn keinen Zoom-Modus?



Ok also das hab ich gemacht

ausblenden C#-Quelltext
1:
2:
3:
                DateTime.FromOADate(time.ToOADate());       //anzeigen double wert von time
                double value1 = 111.0;
                s.Points.AddXY(value1, 1);                  //double wert auf chart schreiben


Also ich hab mir mal anzeigen lassen was in der ersten zeile steht

--> {17.01.2014 09:30:20}
da stehen die milisecounds net drin, aber wenn ich im debug mode bin und bei time auf + gehen und mir dann Milisecounds anzeige steht da schon die 111 drin.

hast du das gemeind? wie ich in zeile 2 und 3 geschrieben hab? einfach ein double wert an AddXY übergeben? bin mir unsicher ob du das gemeind hast, aber gebracht hat es nix

.
Das mit dem zoom modus hab ich schon probiert aber das hat nicht hingehauen.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 21.01.14 16:36 
Laut Doku haben die Axen einen Intervaltypen den man vielleicht mal explizit auf Millisekunden festlegen sollte.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 21.01.14 16:38 
Hallo,

ja so ähnlich meinte ich das, d.h. einen double-Wert mit Nachkommastellen allerdings (denn diese repräsentieren ja die Uhrzeit).

Wenn allerdings die Millisekunden bei time.ToOADate() schon übergeben werden, dann liegt es wohl wirklich an dem Chart-Control.
Kannst du denn mal LabelStyle.Format ändern, um zu sehen, ob dieser Formatwert überhaupt vom Chart-Control angezeigt wird (nicht, daß du an der falschen Stelle suchst)?
KlausNeuer Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 21.01.14 17:01 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Laut Doku haben die Axen einen Intervaltypen den man vielleicht mal explizit auf Millisekunden festlegen sollte.


Das habe ich bereits gemacht in der chart eigenschaft selbst (also kein programmcode dazu) habs aber jetzt nochmal als programmcode reingemacht das man es besser sieht

ausblenden C#-Quelltext
1:
  chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Milliseconds;					


hat aber nix gebracht

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,

ja so ähnlich meinte ich das, d.h. einen double-Wert mit Nachkommastellen allerdings (denn diese repräsentieren ja die Uhrzeit).

Wenn allerdings die Millisekunden bei time.ToOADate() schon übergeben werden, dann liegt es wohl wirklich an dem Chart-Control.
Kannst du denn mal LabelStyle.Format ändern, um zu sehen, ob dieser Formatwert überhaupt vom Chart-Control angezeigt wird (nicht, daß du an der falschen Stelle suchst)?


also ich hab mal

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
                DateTime time = new DateTime(2014117093020111);
                s.Points.AddXY(time.ToOADate(), 1);
                DateTime time2 = new DateTime(2014117093030222);
                s.Points.AddXY(time2.ToOADate(), 1);
                DateTime time3 = new DateTime(2014117093040333);
                s.Points.AddXY(time3.ToOADate(), 1);
                DateTime time4 = new DateTime(2014117093050444);
                s.Points.AddXY(time4.ToOADate(), 1);

                
                s.XValueType = ChartValueType.Time;
                s.XValueType = ChartValueType.DateTimeOffset;
                //chart1.ChartAreas[0].AxisX.LabelStyle.Format = "yyyy:MM:dd   HH:mm:ss:fff "; //Format der Anzuzeigenden 
                chart1.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss:fff "//Format der Anzuzeigenden Daten auf der 
                chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Milliseconds;


das gemacht, und da zeigt er mir auch nur 09:30:20:000 an
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 21.01.14 18:18 
KlausNeuer Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 23.01.14 08:09 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Laut How to display a millisecond of XValues on MS Chart sollte es so richtig sein.


Also bei mir gehts leider so nicht, und wenn ich noch
ausblenden C#-Quelltext
1:
chart1.ChartAreas[0].AxisX.Interval = 1;					

drinne stehen lass und mir die Chart ausgebe bekomm ich auf der X-Achse gar nix angezeigt, als kein datum keine stunde, einfach nix.

Das ist jetzt mein aktueller code

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
                var s = new Series();
                s.ChartType = SeriesChartType.Area;
                s.XValueType = ChartValueType.Time;
                s.XValueType = ChartValueType.DateTimeOffset;
                chart1.ChartAreas[0].AxisX.LabelStyle.Format = "HH:mm:ss:fff "//Format der Anzuzeigenden Daten Xachse
                chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Milliseconds;


                DateTime time = new DateTime(2014117093020111);
                s.Points.AddXY(time.ToOADate(), 1);
                DateTime time2 = new DateTime(2014117093030222);
                s.Points.AddXY(time2.ToOADate(), 1);
                DateTime time3 = new DateTime(2014117093040333);
                s.Points.AddXY(time3.ToOADate(), 1);
                DateTime time4 = new DateTime(2014117093050444);
                s.Points.AddXY(time4.ToOADate(), 1);

                chart1.Series.Clear();                      //Diagramm löschen clearen                   
                chart1.Series.Add(s);                       //alle erstellten Punkte ins diagramm zeichnen



Und ich bekomm einfach keine Milisekunden angezeigt, ich bin am verzweifeln


edit:
Ich habe einen crosspost im Microsoft forum, hoffe aber trotzdem das mir einer von euch bei dem Problem helfen kann! da ich ein forum wie diese hier gemütlicher finde ;)
social.msdn.microsof...forum=visualcsharpde
KlausNeuer Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 23.01.14 17:59 
Hallo,

also das Problem mit den nicht angezeigten Msec ist ein skallierungsproblem das ich jetzt angehen muss

Das ist mein aktuelles problem

Jetzt hab ich nur das Folgendes Problem:

Ich hab normal eine unbekannte Anzahl an Werten, diese können statt Msec auch Sekunden bzw Tage auseinanderliegen, das weiß ich aber vorher nicht .

Wie mach ich da eine Sinnvolle skallierung das mir die Werte richtig angezeigt werden.

in diesem fall



ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
                DateTime time = new DateTime(2014117093030011);
                s.Points.AddXY(time.ToOADate(), 1);
                DateTime time11 = new DateTime(2014117093030111);
                s.Points.AddXY(time.ToOADate(), 1);
                DateTime time2 = new DateTime(2014117093030222);
                s.Points.AddXY(time2.ToOADate(), 1);
                DateTime time3 = new DateTime(2014117093030333);
                s.Points.AddXY(time3.ToOADate(), 1);
                DateTime time4 = new DateTime(2014118093030444);
                s.Points.AddXY(time4.ToOADate(), 1);


zeigt mir die Chart beim ausgeben ein Punkt am 17.1 an (obwohl da mehrerer sind mit kleinen Abständen dazwischen) und dann wieder ein Punkt am 18.1.

Schön wäre wenn ich sehen würde das am 17ten mehrere Punkte liegen und der nächste dann der am 18ten ist.

Also die frage ist auch :

Was ist wenn ich 30 Werte hab, diese unterscheiden sich alle im Msec bereich, diese werte will ich auf der Chart anzeigen, was aber ja nicht geht weil Sie nicht groß genug ist, gibt es da eine möglichkeit mittels einer SCROLLBAR das Fenster weiter zu schieben=?