Wir haben ein Gitter, das an einen %code% der Gegenstände gebunden ist. Wenn der Benutzer auf "Aktualisieren" klickt, werden Änderungen von der Datenbank erhalten und die gebundene Liste wird aktualisiert. Ich stoße auf ein Problem, bei dem doppelte Elemente zum Raster hinzugefügt werden, und ich kann nicht herausfinden, warum.
Der Datenbankaufruf gibt zwei Werte zurück: a %code% der Datensatz-IDs, die geändert wurden, und %code% der aktualisierten Daten für die Datensätze, die geändert wurden. Der existierende Codecode, den ich gerade entpacke, der herausfindet, was aktualisiert werden muss, sieht ungefähr so aus:
%Vor%Das Ergebnis des Aufrufs von %code% ist ein %code% der vorhandenen Datensätze, ein %code% der aktualisierten Datensätze, die ersetzt werden sollen, und ein %code% der IDs, für die Elemente hinzugefügt, entfernt, oder Von der Datenquelle aktualisiert.
Gelegentlich wird ein Datensatz zweimal zum Raster hinzugefügt und ich kann nicht für das Leben von mir herausfinden, wo dieser Code falsch läuft.
Ich habe die Protokolldatei von einer dieser Instanzen abgerufen und kann die folgende Sequenz von Ereignissen deutlich sehen:
%code% von der 2. add sagt mir das
Basierend auf anderen Protokolleinträgen kann ich deutlich sehen, dass Element Nr. 2 zuvor hinzugefügt und nie entfernt wurde. Er sollte also in der %code% -Variable in der %code% -Variable erscheinen, nicht in der %code% . Außerdem wurde Punkt # 2 zwischen dem ersten und dem zweiten Add-in mehrmals erfolgreich aktualisiert, sodass der Code in der Theorie funktionieren sollte. Ich habe auch einen Screenshot der Benutzeroberfläche und zeige beide Kopien von Artikel 2 im Raster der Daten.
Notizen ...
%code% wird nur in der überschriebenen Methode %code% für das Element auf "true" gesetzt. Ich glaube nicht, dass dies passiert wäre.
Bearbeiten: Ich habe seither eine Protokollanweisung hinzugefügt und kann überprüfen, ob %code% in diesem Fall nicht auf %code% gesetzt ist.
Dies ist schon ein paar Mal passiert, aber es ist nicht nur eine einmalige Sache. Ich kann das Problem jedoch nicht nach Bedarf reproduzieren.
Das Raster der Datensätze kann ziemlich groß sein und im Durchschnitt einige tausend Elemente enthalten.
Ich habe die Idee nicht ausgeschlossen, dass der DB-Aufruf ungültige Werte oder Listen zurückgibt, die nicht die gleichen Elemente haben, aber ich sehe nicht, wie dies das Ergebnis beeinflussen könnte
Das einzige Mal, als ich diesen Fehler in Aktion sehen konnte, führten wir einige Tests durch und andere Benutzer änderten Datensatz # 2 ziemlich häufig
Dies alles läuft in einem Hintergrund-Thread
Basierend auf dem Protokoll wurde dies nur einmal ausgeführt. Es lief vorher eine Minute vorher, und nächste 2 Minuten später.
Aus der Log-Datei kann ich sehen, dass Element 2 einige Male korrekt aktualisiert wurde, bevor es ein zweites Mal falsch hinzugefügt wurde. Daher hat dieser Code schon einige Male mit dem vorhandenen Datensatz funktioniert.
Gibt es in dem oben gezeigten Code überhaupt etwas, das dazu führen könnte? Oder vielleicht ein selten bekanntes Problem in C #, wo dies passieren könnte, dass mir nicht bekannt ist?
Es gibt keinen Grund, warum ein vorhandenes Element nicht in %code% mit dem obigen Code gefunden wird.
Ich hätte Alarmglocken in meinem Kopf haben sollen, als ich bemerkte, dass die Ausgabewerte %code% der Werte enthielten, die die ID eines Elements enthielten, und den Index des Elements innerhalb der vorhandenen Liste .
Was passiert ist, wurden Artikel mit %code% entfernt, wobei %code% den Index des Artikels innerhalb von %code% zurückgeben würde. Damit dies funktioniert, müssen Artikel aus dem größten Index nach unten entfernt werden. Wenn ein kleinerer Index vor einem größeren entfernt wird, ist der größere Index nun um 1 Position falsch und das falsche Element wird entfernt.
Warum habe ich doppelte Artikel erhalten, weil zwei Sammlungen gepflegt wurden, eine, die verwendet wurde, um festzustellen, ob Artikel neu / aktualisiert / gelöscht wurden, und ein anderer, der zur Anzeige in der Benutzeroberfläche gebunden wurde. Die erste Sammlung wurde falsch aktualisiert, die zweite nicht, was zu Szenarios führte, in denen Elemente mehrfach zur UI-Sammlung hinzugefügt werden konnten.
Meine kurzfristige Lösung bestand darin, nach der %code% -Auflistung zu sortieren, um sicherzustellen, dass sie nach dem Index jedes Elements in absteigender Reihenfolge sortiert wurde. Meine langfristige Lösung wird sein, den Code neu zu schreiben. :)
würde versuchen, das Objekt a in der Liste zu finden, das a.Equals (r). Wenn MyClass Equals nicht überschreibt, können Sie nicht sicher sein, dass zwei verschiedene Objekte derselben Klasse gleich sind. Ich bin mir da nicht ganz sicher: aber ich denke, dass equals GetHashCode () verwendet. Wenn Sie sich dafür entscheiden, einen von ihnen zu überschreiben, sollten Sie den anderen überschreiben.
hier ist MSDN darüber: Ссылка