tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
416
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    schmitti81 schmitti81 ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    56
    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
     

  2. #2
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  3. #3
    schmitti81 schmitti81 ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    56
    Hier mal ein Auszug aus dem Code.

    Versand ist das EntityObjekt um das es sich hier handelt.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    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
     

  4. #4
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  5. #5
    schmitti81 schmitti81 ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    56
    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 :
    1
    2
    3
    4
    5
    
    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.
     

  6. #6
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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.
    Code csharp:
    1
    2
    3
    4
    5
    6
    
    Versand versand = new Versand(); 
    versand.ID     = nodeVersand.Versand.ID;
    versand.Anzahl = nodeVersand.Versand.Anzahl;
    // ggf. weitere Felder kopieren
         
    _versandListe.Add(versand);
    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  7. #7
    schmitti81 schmitti81 ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    56
    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.
     

  8. #8
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo,

    danke für die Erklärung

    Zitat Zitat von schmitti81 Beitrag anzeigen
    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
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  9. #9
    schmitti81 schmitti81 ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    56
    Vielen Dank, dein vorletzter Post war die Lösung.
     

Ähnliche Themen

  1. Alle Objekte auf einer Ebene die selbe Farbe?
    Von _Alex_ im Forum Photoshop
    Antworten: 2
    Letzter Beitrag: 30.08.10, 15:37
  2. [C++] Zugriff auf ALLE Objekte einer Klasse
    Von Lord-x-DArK im Forum C/C++
    Antworten: 10
    Letzter Beitrag: 12.06.08, 15:35
  3. Antworten: 17
    Letzter Beitrag: 24.10.05, 09:30
  4. In einer Klasse alle Objekte verwalten
    Von p-flash im Forum Flash Plattform
    Antworten: 1
    Letzter Beitrag: 05.06.05, 17:40
  5. UPDATE überschreibt alle Datensätze
    Von Budda im Forum PHP
    Antworten: 4
    Letzter Beitrag: 01.07.04, 16:34