none
Aktuellen Wert auf vorherigen Wert verschieben RRS feed

  • Frage

  • Hallo an das Forum!

    ich habe folgendes Problem und komme einfach nicht weiter...

    Bei der Auswertung einer Datenreihe erhalte ich Bedingungen, die wahr oder falsch sind.

    Wenn eine Bedingung wahr ist (z.B. am Counter 76), möchte ich, dass die Bedingung auch am Counter 75 wahr ist. (Im Beispiel soll PreviousValue um 13.55 wahr sein)

    14.05.2020 13:55:00   Counter  75   myCond   False   Array    False      PreviousValue    False   indexOfChange  22
    14.05.2020 13:56:00   Counter  76   myCond   True   Array    True      PreviousValue    True   indexOfChange  76
    14.05.2020 13:57:00   Counter  77   myCond   False   Array    False      PreviousValue    False   indexOfChange  76

    Allgemein: Wenn der Counter an der Stelle x wahr ist, soll auch an der Stelle x - 1 eine Variable auf true gesetzt werden.

    Um das Problem zu lösen, habe ich viele Ansätze geprüft; alle waren erfolglos.

    Wahrscheinlich ist eine Lösung über ein Array die beste Lösung:

    Hier habe ich aber schon versucht, nur einen Teil des Arrays in ein anders Array zu kopieren, das Array um einen Counter zu verkleinern oder einen Index aus dem Array zu löschen.

    Wie würdet Ihr das Problem lösen?

    Vielen Dank für die Unterstützung!

     


    Gräf


    Donnerstag, 14. Mai 2020 15:28

Antworten

  • Hallo Gräf,

    Eine Möglichkeit wäre, diese Änderung in der Datenquelle vorzunehmen. Im nachfolgenden Beispiel wird eine Datentabelle befüllt, die danach als Datenquelle für die Datenreihe des Diagramms verwendet werden kann. Wenn sie schon geladen und danach geändert wurde, wandle die Datenquelle um und binde sie nach der Änderung wieder als Datenquelle an:

                DataTable meineDatentabelle = chart1.DataSource as DataTable;

    Es werden mithilfe von LINQ die Zeilen ermittelt, deren Werte in der Spalte vom Typ Boolean true sind und nachfolgend der Wert in der booleschen Spalte der vorhergehenden Zeile geändert. Hoffentlich hilft es Dir weiter.

                DataTable meineDatentabelle = new DataTable();
                meineDatentabelle.Columns.Add("Datum", typeof(DateTime));
                meineDatentabelle.Columns.Add("Schalter", typeof(String));
                meineDatentabelle.Columns.Add("Nummer", typeof(int));
                meineDatentabelle.Columns.Add("Bedingung", typeof(bool));
                for (int i = 0; i < 4; i++)
                    meineDatentabelle.Rows.Add(new DateTime(2020, 5, 13, 13, 55+i, 0), "Counter", 75+i, i%2 == 0 ? false : true);
                var Zeilen = meineDatentabelle.AsEnumerable().Where(Zeile => Zeile.Field<bool>("Bedingung") == true);
                foreach (DataRow dr in Zeilen)
                {
                    int Zeilennummer = meineDatentabelle.Rows.IndexOf(dr) - 1;         //die zu ändernde Zeile
                    if(Zeilennummer != -1)                 //wenn das erste Element true ist, ist keine Änderung nötig
                    {
                        meineDatentabelle.Rows[Zeilennummer]["Bedingung"] = true;
                    }
                }

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 15. Mai 2020 15:11
    Administrator
  • Hi,
    dein Ansinnen mit Arrays zu lösen, sehe ich als keinen optimalen Lösungsweg an. Besser ist da in jedem Fall Dimitars Lösungsweg. Wenn dir die Überladung "Where" nicht so geläufig ist, kannst du auch es auch primitiver lösen:

                DataTable meineDatentabelle = new DataTable();
                meineDatentabelle.Columns.Add("Datum", typeof(DateTime));
                meineDatentabelle.Columns.Add("Schalter", typeof(String));
                meineDatentabelle.Columns.Add("Nummer", typeof(int));
                meineDatentabelle.Columns.Add("Bedingung", typeof(bool));
                for (int i = 0; i < 4; i++)
                    meineDatentabelle.Rows.Add(new DateTime(2020, 5, 13, 13, 55+i, 0), "Counter", 75+i, i%2 == 0 ? false : true);
    	    DataRow dr0 = meineDatentabelle.Rows[0];
                for (int i = 1; i < meineDatentabelle.Rows.Count; i++)
                {
                    if (meineDatentabelle.Rows[i].Field<bool>("Bedingung") == true)
                        dr0.Field<bool>("Bedingung") = true;
                    dr0 = meineDatentabelle.Rows[i];
                }


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Samstag, 16. Mai 2020 19:29

Alle Antworten

  • Hallo Gräf,

    Eine Möglichkeit wäre, diese Änderung in der Datenquelle vorzunehmen. Im nachfolgenden Beispiel wird eine Datentabelle befüllt, die danach als Datenquelle für die Datenreihe des Diagramms verwendet werden kann. Wenn sie schon geladen und danach geändert wurde, wandle die Datenquelle um und binde sie nach der Änderung wieder als Datenquelle an:

                DataTable meineDatentabelle = chart1.DataSource as DataTable;

    Es werden mithilfe von LINQ die Zeilen ermittelt, deren Werte in der Spalte vom Typ Boolean true sind und nachfolgend der Wert in der booleschen Spalte der vorhergehenden Zeile geändert. Hoffentlich hilft es Dir weiter.

                DataTable meineDatentabelle = new DataTable();
                meineDatentabelle.Columns.Add("Datum", typeof(DateTime));
                meineDatentabelle.Columns.Add("Schalter", typeof(String));
                meineDatentabelle.Columns.Add("Nummer", typeof(int));
                meineDatentabelle.Columns.Add("Bedingung", typeof(bool));
                for (int i = 0; i < 4; i++)
                    meineDatentabelle.Rows.Add(new DateTime(2020, 5, 13, 13, 55+i, 0), "Counter", 75+i, i%2 == 0 ? false : true);
                var Zeilen = meineDatentabelle.AsEnumerable().Where(Zeile => Zeile.Field<bool>("Bedingung") == true);
                foreach (DataRow dr in Zeilen)
                {
                    int Zeilennummer = meineDatentabelle.Rows.IndexOf(dr) - 1;         //die zu ändernde Zeile
                    if(Zeilennummer != -1)                 //wenn das erste Element true ist, ist keine Änderung nötig
                    {
                        meineDatentabelle.Rows[Zeilennummer]["Bedingung"] = true;
                    }
                }

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 15. Mai 2020 15:11
    Administrator
  • Hi,
    ich würde einfach eine Schleife über die Datenreihe laufen lassen und mir in jedem Durchlauf den Verweis auf das aktuelle Datenelement merken. Im nächsten Schleifendurchlauf wird dann das neue aktuelle Datenelement geprüft und, wenn die Bedingung wahr ist, wird das aus dem vorherigen Durchlauf gemerkte Datenelement entsprechend aktualisiert. Als letzte Anweisung in der Schleife wird dann wieder das aktuelle Datenelement gemerkt, damit es bei Bedarf im nächsten Schleifendurchlauf zur Verfügung steht. Lediglich für das erste Datenelement gesichert werden, dass da eine Prüfung unsinnig ist, da es davor kein Datenelement gibt.

    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Samstag, 16. Mai 2020 08:15
  • Hallo Peter,

    vielen Dank für die Unterstützung!

    Ich habe die Lösung (fast) gefunden ...

    Folgender Code funktioniert:

    MyBoolArraySource[index] = myCond;
    	
    if (index < MyBoolArraySource.Length - 1)
    {
    Array.Copy(MyBoolArraySource, index, MyBoolArrayDestination, index -1, MyBoolArraySource.Length - index); 
    }
    15.05.2020 21:24:00   Index  863   myCond   False   Source    False	  Destination    False
    15.05.2020 21:25:00   Index  864   myCond   False   Source    False	  Destination    True
    15.05.2020 21:26:00   Index  865   myCond   True   Source    True	  Destination    False

    Leider muss ich das Programm zweimal aufrufen, um dieses Ergebnis zu erzielen.

    Wie kann ich das Problem lösen?

    Mit freundlichen Grüßen


    Gräf

    Samstag, 16. Mai 2020 16:26
  • Hallo Dimitar,

    vielen Dank für Deine Unterstützung!

    Du hast mir wertvolle Hinweise für eine demnächst anstehende Aufgabe gegeben.

    LINQ habe ich aber bisher noch nicht verstanden und schaue immer mit großer Bewunderung auf die Syntax ...

    Mit freundlichen Grüßen


    Gräf

    Samstag, 16. Mai 2020 16:32
  • Hi,
    dein Ansinnen mit Arrays zu lösen, sehe ich als keinen optimalen Lösungsweg an. Besser ist da in jedem Fall Dimitars Lösungsweg. Wenn dir die Überladung "Where" nicht so geläufig ist, kannst du auch es auch primitiver lösen:

                DataTable meineDatentabelle = new DataTable();
                meineDatentabelle.Columns.Add("Datum", typeof(DateTime));
                meineDatentabelle.Columns.Add("Schalter", typeof(String));
                meineDatentabelle.Columns.Add("Nummer", typeof(int));
                meineDatentabelle.Columns.Add("Bedingung", typeof(bool));
                for (int i = 0; i < 4; i++)
                    meineDatentabelle.Rows.Add(new DateTime(2020, 5, 13, 13, 55+i, 0), "Counter", 75+i, i%2 == 0 ? false : true);
    	    DataRow dr0 = meineDatentabelle.Rows[0];
                for (int i = 1; i < meineDatentabelle.Rows.Count; i++)
                {
                    if (meineDatentabelle.Rows[i].Field<bool>("Bedingung") == true)
                        dr0.Field<bool>("Bedingung") = true;
                    dr0 = meineDatentabelle.Rows[i];
                }


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Samstag, 16. Mai 2020 19:29
  • Herzlichen Dank für die Unterstützung!

    Ihr habt mir sehr geholfen.

    Mit freundlichen Grüßen


    Gräf

    Freitag, 22. Mai 2020 14:51