Neues Objekt überschreibt alle Objekte einer Liste

schmitti81

Mitglied
Hallo,

ich habe ein Problem mit List<>.

Ich habe eine Funktion in der ein EntityObject (Versand) in eine Liste geschrieben wird.

Diese Funktion kann mehrmals aufgerufen werden.
Es kann vorkommen, dass dasselbe EntityObject erneut der Liste hinzugefügt wird, allerdings mit einem unterschiedlichen Wert.

Jetzt habe ich das Problem, dass das neue EntityObject mir das alte EntityObject überschreibt.
Mir ist klar warum.
Die ID des neuen EntityObjects ist gleich der ID des alten.

Wie kann ich das Problem beheben?
Ich habe versucht mit einer zusätzlichen ID, die sich bei jedem Durchlauf der Funktion ändert, das Problem zu beheben.
Hat aber leider keine Änderung gebracht.

Beispiel:
Versand mit ID 28 und Anzahl 1 wird in eine Liste geschrieben.
2. Aufruf der Funktion, Versand mit ID 28 und Anzahl 3 wird in die gleiche Liste geschrieben.

Jetzt steht in der Liste an jeder Stelle mit dem EntityObjekt Versand mit der ID 28 der Wert 3bei Anzahl.

Kann mir jemand helfen? Danke.

Grüße
schmitti81
 
Hallo,

erzeugst du tatsächlich immer eine neues EntityObjekt oder modifizierst du evt. ein schon vorhandenes und fügst es dann der Liste hinzu? Die Liste speichert ja nur Referenzen. Vor jedem Hinzufügen muss daher irgendwo explizit ein "new EntityObjekt()" stehen.

Gruß
MCoder
 
Hier mal ein Auszug aus dem Code.

Versand ist das EntityObjekt um das es sich hier handelt.

Code:
private Versand _versand;
private List<Versand> = new List<Versand>();

private void VersandBewegung(NodeVersand nodeVersand)
{
     _versand = new Versand();
     _versand = nodeVersand.Versand;
     
     _versandListe.Add(_versand);
}

Sobald ich ein neues "Versand"-Objekt habe wird in der Liste das Andere mit den Werten des neuen Objekts überschrieben.

Der EntityKey ist bei beiden Objekten der gleiche, da es das gleiche Objekt ist.
Ich kann nur einmal 5 Teile und dann noch 3 Teile vom gleichen Objekt bewegen.

Danke!

Viele Grüße
schmitti81
 
Hallo,

"_versand = new Versand();" ist hier sinnlos, weil "_versand" in der folgenden Zeile gleich wieder überschrieben wird. Was ist NodeVersand und woher kommt das Versand-Objekt dort? So wie es aussieht, modifizierst du ein bereits vorhandenes Versand-Objekt und änderst damit natürlich alle Einträge in der Liste, die darauf referenzieren.

Gruß
MCoder
 
Ich habe eine TreeView.
Wenn der ausgewählte Node von dem Treeview ein Objekt vom Typ Versand ist, rufe ich die Funktion "VersandBewegung" mit dem ausgewählten Node aus.

In meinem Fall:

Code:
TreeNode selectedNode = null;

selectedNode = this.tvVersand.SelectedNode;

VersandBewegung((NodeVersand)selectedNode);

Heißt das, der selectedNode ist das Problem?

Hm, wie kann ich das ändern?

Vielen Dank.
 
Hallo,

ich glaube, ich habe das Konzept noch nicht richtig verstanden.

Du hältst also die Versand-Objekte in dem TreeView. Gibt es in dem TreeView auch mehrere Nodes, die ein Versand-Objekt mit gleicher ID aber unterschiedlicher Anzahl beinhalten?

Wenn ja, verstehe ich die doppelte Datenhaltung in der Liste nicht.

Wenn nein, musst du mir mal den Zweck der Liste erklären. Dann wäre es wohl auch sinnvoller, nicht das Versand-Objekt des jeweiligen TreeNodes in die Liste zu schreiben, sondern nur eine Kopie davon.
C#:
Versand versand = new Versand(); 
versand.ID     = nodeVersand.Versand.ID;
versand.Anzahl = nodeVersand.Versand.Anzahl;
// ggf. weitere Felder kopieren
     
_versandListe.Add(versand);
Gruß
MCoder
 
Ok, ich versuche das nochmal anders zu erklären.

Ich hab einen TreeView, in dem Objekte zum Versenden stehen.
Es können nicht mehrere Nodes ein Versand-Objekt mit gleicher ID haben, d.h. ich habe an einem Node ein Versand-Objekt(ID=2, Anzahl=5).

Jetzt schreibe ich das Versand-Objekt in eine Liste u. das Versand-Objekt wird in einem anderen TreeView angezeigt.
In der Liste werden die Versand-Objekte für eine Undo/Redo-Funktion gespeichert.

Aber das Problem ist ja nicht nur die Liste, auch in dem TreeView wird die Anzahl falsch angezeigt.

Also z.B. wähle ich das Versand-Objekt (ID=2, Anzahl=3) aus und wird an Node1 in dem anderen TreeView angehängt.
Dann wähle ich "später" das gleiche Versand-Objekt mit anderer Anzahl (ID=2, Anzahl=1) aus und hänge es an Node2 in dem anderen TreeView.
Das wird auch wieder in die Liste geschrieben.

Dabei erhält aber auch das erste Versand-Objekt mit der ID=2, die Anzahl=1, obwohl die Anzahl eigentlich 3 war.

Ich hoffe das macht mein Problem verständlicher.
 
Hallo,

danke für die Erklärung

Aber das Problem ist ja nicht nur die Liste, auch in dem TreeView wird die Anzahl falsch angezeigt.
Wie schon gesagt, das Problem entsteht dadurch, dass alles Referenzen sind. Du verwendest daher ein und dasselbe Versand-Objekt in verschiedenen Ansichten und Datenstrukturen. Wird es an einer Stelle geändert sind automatisch auch alle anderen Ansichten/Datenstrukturen davon betroffen.

Die Lösung hatte ich schon in meiner letzten Antwort vorgeschlagen: Sobald das Versand-Objekt an einer anderen Stelle abgelegt werden soll, nimm eine Kopie dafür. Die Indentifizierung erfolgt ja sowieso über ein ID-Feld und damit kannst du die Objekte bei Bedarf immer wieder zusammenführen.

Gruß
MCoder
 

Neue Beiträge

Zurück