|
VB.Net-Forum - Beitragsübersicht - |
|
Thema | V03: Komplexes Problem: Casting oder DataGrid |
Von |
Stan |
Datum |
23. Februar 2016 um 22:53:31 |
Frage |
Hallo zusammen,
ich habe noch ein Thema bei dem ich einen Sparringspartner brauche.
Ich habe ein DataGrid, dass ich direkt an eine ObservableCollection gebunden habe. Die Collection ist von meinem Basistyp, sagen wir zur Vereinfachung, diese wäre vom Typ Fahrzeug. Nun gibt es mehrere Ableitungen wie z.B. Auto oder Flugzeug.
Meine Idee war, dass der User im Datagrid alle Fahrzeuge(Auto, Flugzeug, etc) sehen und bearbeiten kann. Anfäglich kann der User nur die Eigenschaften verändern, die alle gemeinsam besitzen, also Fahrzeug. Setzt der User einen Filter, beidem nur noch Autos übrg bleiben, so würde ich die ObservableCollection Casten und darauß Autos machen. Der User könnte sofort alle Eigenschaften eines Autos bearbeiten. Hochdynamisch ;-)
Mein Problem ist das Anlegen einer neuen Zeile. Der User sollte die Art des Fahrzeugs über eine Dropdownliste auswählen können. Allerdings wird durch das DataGrid bereits beim Anklicken der neuen Zeile ein neues Objekt angelegt, dann vom Basistyp.
Zuerst wollte ich das Anlegen der neuen Zeile bis zur Auswahl des Typs via Combobox heruaszögern, aber ich glaube das DataGrid braucht den Eintrag zur Datenhaltung. => Hier bin aber offen für Lösungsvorschläge
Deshalb habe ich mich auf das Casten konzentriert, um die Objekte im Nachgang zu verändern. Ich weiß, dass ich => aus einem Child immer den Parent casten kann(Auto => Fahrzeug) => den so erstellen Parent wieder zum Child casten kann(Fahrzeug(Auto) => Auto)
Allerdings müsste ich ein reinen Parent zu einem beliebigen Child(Fahrzeug => Auto) "erweitern", beziehungsweise ein Child in ein anderes Child(Auto => Flugzeug) "umwandeln" können. Ich würde einen Datenverlust aller Childvariablen akzeptieren.
Irgendwelche Ideen?
Beste Grüße StanPublic Class Fahrzeug Public geschwindigkeit As Integer End Class Public Class Auto Inherits Fahrzeug Public Allrad As Boolean End Class Public Class Flugzeug Inherits Fahrzeug Public maxFlughoehe As Long End Class |
|
Antwort: |
Von |
stan |
Datum |
05. März 2016 um 15:32:49 |
Antwort |
Hallo Nico,
also ich habje jetzt etliche Stunden gebraucht um den Code zu verstehen - zwar vestehe ich noch nicht genau wie TFilter funktioniert(ich kann mir zum Beispiel zur Laufzeit keine Werte anzeigen lassen, sowas habe ich noch nicht verwendet) aber ich verstehe die Kernpunkte und ich finde deine Lösung genial.
Du hast einen kleinen Schönheitsfehler im Konstruktur von ObservableCollectionViewEnumerator gemacht. Hier darf SucheNächstesElementMitPassendemTyp nicht aufgerufen werden, da der Aufruf später über MoveNext erfolgt. Ansonsten fehlt dir in jeder Auflistung das erste Element xD Public Sub New(datenQuelle As ObservableCollection(Of TBasis)) baseEnumerator = datenQuelle.GetEnumerator() 'SucheNächstesElementMitPassendemTyp() => Die Zeile muss raus End Sub Mir scheint es aber so, als würde garnicht die Klasse die Felder des DataGrid bestimmen sondern das erste Objekt, dass in einer Liste enthalten ist. Wenn ich dein Beispiel so ändere, dass man auch Objekte vom Typ Transportmittel anlegen kann und ich setze den Filter auf Transportmittel(also ALLE Ergebnisse), dann bekomme ich immer die Felder, die das erste Objekt hat und nicht nur die von Transportmittel.
Anyway - vielen Dank - deine Antworten waren super hilfreich ;-)
Beste Grüße stan |
|
[ Antwort schreiben | Zurück zum VB.Net-Forum | Forum-Hilfe ] |
|
Letzte Aktualisierung: Sonntag, 13. Dezember 2015 |
|