Laden...

Forms Chart Darstellung mit DateTime in Millisekunden-Auflösung auf X-Achse

Erstellt von WilfriedHerman vor 10 Jahren Letzter Beitrag vor 10 Jahren 5.158 Views
W
WilfriedHerman Themenstarter:in
8 Beiträge seit 2014
vor 10 Jahren
Forms Chart Darstellung mit DateTime in Millisekunden-Auflösung auf X-Achse

Hallo,

zunächst, ja ich habe hier schon die Suche benutzt und die Grundlagen etc. durchgelesen. Hab hier kein Grundlagen problem zu csharp sondern zum aufbau einer ordentlichen Chart in forms mit c# natürlich.

Vorerst, arbeite mit .net framework 4 und visual studio 2010

Nun zu meinem Problem.

Ich habe mehrere Forms in den verschiedene dinge passieren. Dann gibt es auch noch eine Form die per knopfdruck vorher erzeugte werte in einem Diagramm ausgibt.

Das sind meine Private/Public auf die ich zugreife




        private string[] _InfoNew = new string[80000];

        public string[] InfoNew
        {
            get { return _InfoNew; }
            set { _InfoNew = value; }
        }


        private string[] _YearNew = new string[80000];

        public string[] YearNew
        {
            get { return _YearNew; }
            set { _YearNew = value; }
        }

        private string[] _MonthNew = new string[80000];

        public string[] MonthNew
        {
            get { return _MonthNew; }
            set { _MonthNew = value; }
        }

        private string[] _DayNew = new string[80000];

        public string[] DayNew
        {
            get { return _DayNew; }
            set { _DayNew = value; }
        }

        private string[] _HourNew = new string[80000];

        public string[] HourNew
        {
            get { return _HourNew; }
            set { _HourNew = value; }
        }

        private string[] _MinNew = new string[80000];

        public string[] MinNew
        {
            get { return _MinNew; }
            set { _MinNew = value; }
        }

        private string[] _SecNew = new string[80000];

        public string[] SecNew
        {
            get { return _SecNew; }
            set { _SecNew = value; }
        }

        private string[] _MsecNew = new string[80000];

        public string[] MsecNew
        {
            get { return _MsecNew; }
            set { _MsecNew = value; }
        }

Was soll überhaupt passieren:

Ich habe aus vorherig erzeugtem Programmcode mir meine genaue Uhrzeit in einem Array abgespeichert. Ich habe hier Jahr/Monat/tag/Stunde/Minute/Sekunde/Msekunde
Jeder wert ist in einem einzelnen Array.

Die Zusammengehörenden Zeiten haben den selben Array index.
als Bsp.
Die Uhrzeit 10.01.2014 14:30:10:123 wurde gespeichert.
Dann ist der inhalt von

YearNew[0] = 14
MonthNew[0]=01
DayNew[0]=10
HourNew[0]=14
MinuteNew[0]=30
SecoundNew[0] = 10
MSecoundNew[0] =123

Die nächste gespeicherte Uhrzeit hat komplett den index [1] usw.
Ich habe immer einen unterschiedliche anzahl von werten. Ich weiß aber die Anzahl der werte. Z.b. 4.

Mein großes Problem ist, das ich eine chart erstellen will, in der:

  1. Die X-Achse Die Zeit beinhaltet und min und max sich quasi automatisch einstellen anhand meiner min und max werte.
  2. Hab ich noch eine Membervariable info. diese ist z.b. für den ersten fall index [0] = 10
    info[0] = 10;
    info[1] = 20;

diese werte geben mir meine Y höhe an.

Problem bei der Zeit wie auch hier. Es kann zum einen Sein das nur Msec zwischen den Werten liegen und manchmal tage.
die werte von info können beliebig groß sein z.b . auch 50000

Ich bin hier sehr am verzweifeln und hab mir schon alles mögliche durchgelesen und angeschaut, kann es jedoch nicht auf mein problem übertragen

das ist mein programmcode

        private void button_grafisch_auswerten_Click(object sender, EventArgs e)
        {
            
            if (FrmReadIn.AuswertungFlankeImp == true)
            {
                chart1.Series.Clear();
                var s = new Series();
                s.ChartType = SeriesChartType.Line;
                //chart1.Series[0].XValueType = ChartValueType.DateTime;      //dadurch ist auf der x-achse das Date and Time
                s.XValueType = ChartValueType.DateTime;
              
                int[] HighValue = new int[FrmReadIn.LineCounter];       //soviele high werte wie der LineCounter gezählt hat evtl -1              
                DateTime dt = new DateTime();
                int YearI = 0, MonthI = 0, DayI = 0, HourI = 0, MinI = 0, SecI = 0, MSecI = 0;
                #region Impuls Auswertung
                for (int i = 0; i < FrmReadIn.LineCounter; i++)
                {
                    HighValue[i] = 1;
                    Int32.TryParse(FrmReadIn.YearNew[i], out YearI);  //Eingegebenen Wert in Int umwandeln
                    Int32.TryParse(FrmReadIn.MonthNew[i], out MonthI);
                    Int32.TryParse(FrmReadIn.DayNew[i], out DayI);
                    Int32.TryParse(FrmReadIn.HourNew[i], out HourI);
                    Int32.TryParse(FrmReadIn.MinNew[i], out MinI);
                    Int32.TryParse(FrmReadIn.SecNew[i], out SecI);
                    Int32.TryParse(FrmReadIn.MsecNew[i], out MSecI);

                    
                    s.Points.AddXY(dt, 1);
                }
                chart1.Series.Add(s);
              

FrmReadin.Linecounter hat die Anzahl der Werte hinterlegt , also wieviele infos + datums ich habe.

ich hoffe ihr könnt mir ein paar tipps geben! und nicht nur auf grundlagen verweißen

danke

2.207 Beiträge seit 2011
vor 10 Jahren

Hallo WilfriedHerman,

und willkommen im Forum.

Ehrlich gesagt habe ich dein Problem noch nicht verstanden. Was genau ist deine Frage?

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 5

Ich glaube aber, dass du dir den DateTime-Typ mal anschauen solltest. Der spart dir vielleicht viel Arbeit.

... ich brauch schnell eine lösung.

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 7

Beachte bitte ausserdem [Tipp] Anfängerfehler == true / == false

Gruss

Coffeebean

W
WilfriedHerman Themenstarter:in
8 Beiträge seit 2014
vor 10 Jahren

HI, sorry das ist ja total untergegangen vor lauter schreiben 😕 stressige arbeit sorry leute.

Also mein Problem ist, Ich bekomm die Genaue Zeitangabe also mit Msec und allem nicht auf der X-Achse angezeigt.
Das mit dem Datentyp hab ich mir schon angeschaut, werd es aber nochmal machen.

Und Außerdem hab ich das problem das meine X - Achse ja jedes mal anders sein kann, ich kann ihr keinen festen wert vorgeben.

aber das hauptproblem ist das ich die punkte im diagramm nicht angezeigt bekomm.
Also die zeit auf die x achse

edit:

Ja und ich muss aus meinen einzelnen int werten für jahr monat tag stunde min sec msec
in eine form packen das ich sie auf der X - achse ausgeben kann

Auch ein problem ist wie ich den Intervalltyp setze, ich kann ihn nicht auf stunden setzen da manchmal nur msec zwischen den datensätzen liegen, manchmal auch tage

64 Beiträge seit 2012
vor 10 Jahren

Bei dir werden wohl alle Punkte auf einer Ebene hängen.

Du fügst den Punkt ja mit :

                   s.Points.AddXY(dt, 1);

hinzu. Aber dein "dt" ist immer new Datetime().

  
DateTime dt = new DateTime();  
  

deine schleife wäre wohl besser wenn du



for (int i = 0; i < FrmReadIn.LineCounter; i++)
                {
                    HighValue[i] = 1;
                    Int32.TryParse(FrmReadIn.YearNew[i], out YearI);  //Eingegebenen Wert in Int umwandeln
                    Int32.TryParse(FrmReadIn.MonthNew[i], out MonthI);
                    Int32.TryParse(FrmReadIn.DayNew[i], out DayI);
                    Int32.TryParse(FrmReadIn.HourNew[i], out HourI);
                    Int32.TryParse(FrmReadIn.MinNew[i], out MinI);
                    Int32.TryParse(FrmReadIn.SecNew[i], out SecI);
                    Int32.TryParse(FrmReadIn.MsecNew[i], out MSecI);
                    
                    dt = new DateTime(YearI,MonthI,DayI,HourI,MinI,SecI,MSecI);
                    
                    s.Points.AddXY(dt, info[i]);
                }

verwenden würdest. Noch besser natürlich wenn du gleich mit Datetime arbeiten würdest

++Rekursion ++
(lat. , die) siehe Rekursion

W
WilfriedHerman Themenstarter:in
8 Beiträge seit 2014
vor 10 Jahren

Das hab ich grad auch schon probiert

also so

  chart1.Series.Clear();
                var s = new Series();
                s.ChartType = SeriesChartType.Line;
                //chart1.Series[0].XValueType = ChartValueType.DateTime;      //dadurch ist auf der x-achse das Date and Time
                s.XValueType = ChartValueType.DateTime;
              
                int[] HighValue = new int[FrmReadIn.LineCounter];       //soviele high werte wie der LineCounter gezählt hat evtl -1              
               // DateTime dt = new DateTime();

                Dictionary<DateTime, int> values = new  Dictionary<DateTime, int>();

                int YearI = 0, MonthI = 0, DayI = 0, HourI = 0, MinI = 0, SecI = 0, MSecI = 0;
                #region Impuls Auswertung
                for (int i = 0; i < FrmReadIn.LineCounter; i++)
                {
                    HighValue[i] = 1;
                    Int32.TryParse(FrmReadIn.YearNew[i], out YearI);  //Eingegebenen Wert in Int umwandeln
                    Int32.TryParse(FrmReadIn.MonthNew[i], out MonthI);
                    Int32.TryParse(FrmReadIn.DayNew[i], out DayI);
                    Int32.TryParse(FrmReadIn.HourNew[i], out HourI);
                    Int32.TryParse(FrmReadIn.MinNew[i], out MinI);
                    Int32.TryParse(FrmReadIn.SecNew[i], out SecI);
                    Int32.TryParse(FrmReadIn.MsecNew[i], out MSecI);

                    DateTime dt = new DateTime(YearI, MonthI, DayI, HourI, MinI, SecI, MSecI, DateTimeKind.Utc);


  //                  dt.ToOADate();
                    
                    s.Points.AddXY(dt, 1);
                   

Aber da bekomm ich beim debugen ein fehler an der stelle s.Points.AddXY(dt,1)
das des kein zulässiger OleAUt typ ist

die 1 bei s.Points.AddXY(dt, 1); hab ich nur zum testen reingeschrieben das ich quasi jedes mal wenn ein datum erfasst wurde auf y höhe = 1 gehe

Und wenn ich die Zeile dt.ToOADate(); drinne lass bleibt der debuger da stehen und sagt unzulässiges OleAut-Datum

64 Beiträge seit 2012
vor 10 Jahren

Gibt es einen Grund das du die X Achseneinschränkung auf Datetime auskommentiert hast?

  
 s.ChartType = SeriesChartType.Line;  
 //chart1.Series[0].XValueType = ChartValueType.DateTime;   //dadurch ist auf der x-achse das Date and Time  
s.XValueType = ChartValueType.DateTime;  
  
 int[] HighValue = new int[FrmReadIn.LineCounter];  //soviele high werte wie der LineCounter gezählt hat evtl -1                
 // DateTime dt = new DateTime();  
  

Edit: Formatierung

++Rekursion ++
(lat. , die) siehe Rekursion

W
WilfriedHerman Themenstarter:in
8 Beiträge seit 2014
vor 10 Jahren

ok also der fehler mit dem Datum ist behoben...

Ich hab dem für 2014 eine 14 übergeben und ich bin einfach net draufgekommen was da net passen sollte!

Problem ist jetzt:
Er Zeigt mir eine Chart an

aber da sich meine Zeiten nur im MSec bereich unterscheiden hab ich einfach an dem tag 17.1.2014 als beispiel einen strich.
hab den xvaluetyp auf DateTime

Nur brauch ich eine viel viel höherer Auflösung und vor allem muss man in der Grafik nicht nur Jahr:Monat:Tag sondern auch Stunde:Min:Sec:MSec sehen können.

kann mir wer sagen wie das geht.??

2.207 Beiträge seit 2011
vor 10 Jahren

Hallo WilfriedHerman,

du brauchst eine feinere Skalierung deiner Achse.

Ich hab dem für 2014 eine 14 übergeben und ich bin einfach net draufgekommen was da net passen sollte!

Das hättest du mit dem Debugger leicht herausbekommen.

Gruss

Coffeebean

W
WilfriedHerman Themenstarter:in
8 Beiträge seit 2014
vor 10 Jahren

jo hab ich ja dann auch letztendlich 😉
Ja gut das ich eine feinere skallierung brauch ist mir ansich klar, doch wie setz ich das um. Ich weiß ja nie wie fein sie werden soll

manchmal hab ich 5 werte auf 1 tag verteilt
manchmal 5 werte auf 1 sekunde verteilt.

das ist jetzt ja grad mein problem, um tipps wär ich dankbar. bin hier schon die ganze zeit am herumprobieren

W
WilfriedHerman Themenstarter:in
8 Beiträge seit 2014
vor 10 Jahren

folgendes problem

 DateTime time = new DateTime(2014, 1, 17, 09, 30, 20, 100);
                s.Points.AddXY(time.ToOADate(), 1);
                DateTime time2 = new DateTime(2014, 1, 17, 09, 30, 30, 200);
                s.Points.AddXY(time2.ToOADate(), 1);
                DateTime time3 = new DateTime(2014, 1, 17, 09, 30, 40, 200);
                s.Points.AddXY(time3.ToOADate(), 1);
                DateTime time4 = new DateTime(2014, 1, 17, 09, 30, 50, 200);
                s.Points.AddXY(time4.ToOADate(), 1);
                //test ende

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

Ich bekomme aber auf dem Chart einfach nicht die Milisecounds angezeigt,
Jahr:monat:Tag:Stunde:Minute:Sekunde geht, jedoch steht bei den Milisekunden im diagramm immer 000

W
WilfriedHerman Themenstarter:in
8 Beiträge seit 2014
vor 10 Jahren

push------------------

64 Beiträge seit 2012
vor 10 Jahren

Hast du Statt :

  
s.XValueType = ChartValueType.Time;  
  

mal


s.XValueType = ChartValueType.DateTimeOffset;

versucht?

Zudem noch einmal der Hinweis auf: [Hinweis] Wie poste ich richtig?

  1. Nicht gleich pushen, nicht drängeln

++Rekursion ++
(lat. , die) siehe Rekursion

W
WilfriedHerman Themenstarter:in
8 Beiträge seit 2014
vor 10 Jahren

sorry wollt nicht drängen, bin nur im stress 😕 kennt ihr sicherlich

habe es zzt. auf .Time stehen!

aber beides hat nix gebracht er zeigt mir einfach nicht die Milisekunden an! der Rest passt.

Hinweis von herbivore vor 10 Jahren

Denn Stress solltest du bitte nicht ins Forum tragen. Die Helfer helfen hier kostenlos und freiwillig. Bitte setzte sie in keiner Weise unter Druck. Auch im eigenen Interesse, denn oft erreicht man dadurch das Gegenteil.