Benutzer mit den meisten Antworten
Aktuellen Wert auf vorherigen Wert verschieben

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
- Bearbeitet user10101994 Donnerstag, 14. Mai 2020 15:31
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.
- Bearbeitet Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 15. Mai 2020 20:22
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Freitag, 22. Mai 2020 13:57
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Mittwoch, 3. Juni 2020 15:52
-
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- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Freitag, 22. Mai 2020 13:58
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Mittwoch, 3. Juni 2020 15:52
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.
- Bearbeitet Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 15. Mai 2020 20:22
- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Freitag, 22. Mai 2020 13:57
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Mittwoch, 3. Juni 2020 15:52
-
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- Bearbeitet Peter Fleischer Samstag, 16. Mai 2020 14:31
-
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
-
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
-
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- Als Antwort vorgeschlagen Ivan DragovMicrosoft contingent staff, Moderator Freitag, 22. Mai 2020 13:58
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Mittwoch, 3. Juni 2020 15:52