Synchronisieren einer Sammlung von umgebrochenen Objekten mit einer Sammlung von unverpackten Objekten

9

Ich habe zwei Klassen: Employee und EmployeeGridViewAdapter . Employee setzt sich aus mehreren komplexen Typen zusammen. EmployeeGridViewAdapter umschließt einen einzelnen Employee und stellt seine Member als eine reduzierte Gruppe von Systemtypen zur Verfügung, so dass DataGridView Anzeige, Bearbeitung usw. verarbeiten kann.

Ich verwende die integrierte Unterstützung von VS, um ein POCO in eine Datenquelle zu verwandeln, die ich dann an ein Objekt BindingSource anschließe. Wenn ich die DataGridView an die BindingSource angehängt habe, erstellt sie die erwarteten Spalten und zur Laufzeit kann ich die erwarteten CRUD-Operationen ausführen. Bis jetzt ist alles gut.

Das Problem besteht in der Sammlung von Adaptern, und die Sammlung von Mitarbeitern wird nicht synchronisiert. So werden alle Mitarbeiter, die ich eine Laufzeit erstellen nie dauerhaft erhalten. Hier ist ein Ausschnitt des Codes, der die Sammlung von EmployeeGridViewAdapter s erzeugt:

%Vor%

Ziemlich einfach, aber ich kann nicht herausfinden, wie man die Änderungen wieder mit der ursprünglichen Sammlung synchronisiert. Ich stelle mir vor, dass Bearbeitungen bereits bearbeitet werden, da beide Sammlungen auf dieselben Objekte verweisen, aber das Erstellen neuer Mitarbeiter und das Löschen von Mitarbeitern nicht stattfindet, kann ich nicht sicher sein.

    
Kenneth Cochran 11.03.2010, 15:35
quelle

2 Antworten

1

Das erste Problem scheint darin zu bestehen, dass Sie eine neue Liste und Datenbindung erstellen. Wenn Sie Elemente hinzufügen, werden diese zur Sammlung hinzugefügt, aber Ihre ursprüngliche Mitarbeiterliste bleibt unverändert.

Um dies zu vermeiden, sollten Sie entweder eine benutzerdefinierte Erfassungsklasse bereitstellen, die Änderungen zurück in die zugrunde liegende Mitarbeiterliste migriert, oder die entsprechenden Ereignisse verdrahten (um die Migration beim Einfügen / Löschen durchzuführen), bevor die Daten an sie gebunden werden.

Um eine Reihe anderer Probleme beim Binden bearbeitbarer Sammlungen an Raster zu vermeiden, sollten Sie die Datenbindungsschnittstellen implementieren, wie unten beschrieben. Das Vorhandensein dieser Schnittstellen ermöglicht es den visuellen Steuerelementen, die zugrunde liegende Sammlung über Aktionen wie "Einfügung abgebrochen" zu benachrichtigen (wenn Benutzer die Eingabe eines neuen Datensatzes abbricht) und in ähnlicher Weise Informationen in die entgegengesetzte Richtung fließen zu lassen (UI bei Erfassung oder Einzelperson aktualisieren) Einträge ändern sich).

Zuerst sollten Sie mindestens IEditableObject, INotifyPropertyChanged und IDataErrorInfo für die einzelnen Elemente in einer datengebundenen Auflistung implementieren, was in Ihrem Fall die EmployeeGridViewAdaper-Klasse wäre.

Außerdem möchten Sie, dass Ihre Sammlung ITypedList und INotifyCollectionChanged implementiert. Die BCL enthält eine BindingList-Implementierung, die einen guten Ausgangspunkt dafür bietet. Empfehlen Sie diese anstelle der einfachen Liste.

Ich kann Datenbindung mit Windows Forms 2.0 für eine umfassende Darstellung dieses Themas empfehlen.

    
Morten Mertner 24.03.2010, 05:41
quelle
3

Sie könnten auch erwägen, System.Collections.ObjectModel.ObservableCollection zu verwenden und es zu verkabeln < a href="http://msdn.microsoft.com/en-us/library/ms653375.aspx"> CollectionChanged Ereignis. Es könnte in etwa so aussehen.

%Vor%

Code nimmt die folgenden using-Anweisungen an.

%Vor%

Wenn Sie die IList Schnittstelle benötigen, können Sie auch System.ComponentModel.BindingList und verbinden Sie es mit ListChanged Ereignis. Es könnte so aussehen.

%Vor%

Code nimmt die folgende using-Anweisung an.

%Vor%     
VoidDweller 25.03.2010 14:15
quelle

Tags und Links