Änderungen an DataGridView zurück in das DataSet schreiben

  • .NET (FX) 4.5–4.8
  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von michivandersar.

    Änderungen an DataGridView zurück in das DataSet schreiben

    Hallo zusammen,

    Ich bin gerade dabei mich mit DataSets und LINQ, etc zu beschäftigen und habe ein schönes Projekt für mich gefunden. Inzwischen krieg ich die Darstellung und Filterung der Daten ziemlich gut hin, jedoch hängts beim Zurückschreiben der Änderungen von der DataGridView in mein DataSet.

    Soweit zu meinem Problem, nun zu meinem Projekt. Ich habe ein sehr einfaches DataSet (ScreenShot im Anhang). Zwei Tabellen mit einer 1:n-Verknüpfung. Track.CD zeigt auf CD.Id.

    Die Daten lese ich mittel LINQ aus dem DataSet mit einem Join aus. Und ich glaube dieses Join erschwert mir die Sache, denn ich konnte die Query nicht direkt als Source angeben, sondern habe das jetzt mit einem "Object Shredder" (msdn.microsoft.com/en-us/library/bb669096(v=vs.110).aspx) mappen müssen. Bei einer Abfrage ohne Join würden die Änderungen meinem Verständnis nach direkt zurückgeschrieben, jedoch ist das hier nicht "direkt gemappt".

    Ich habe bereits versucht Lösungen zu finden, habe aber leider nichts nützliches gefunden (vlt falsche Begriffe?). Das hier war mein einziges Ergebnis und die Antwort war leider nur, dass es "tricky" sein wird das zu realisieren.

    Und nun der Code wie die Daten in die GridView kommen.

    VB.NET-Quellcode

    1. Dim cds As DataTable = dsData.Tables("cd")
    2. Dim tracks As DataTable = dsData.Tables("track")
    3. Dim dtSource As DataTable
    4. Dim query = From cd In cds.AsEnumerable _
    5. Join track In tracks.AsEnumerable _
    6. On cd.Field(Of Integer)("id") Equals track.Field(Of Integer)("cd") _
    7. Where (track.Field(Of String)("titel").ToLower() & " " & track.Field(Of String)("interpret").ToLower() & " " _
    8. & track.Field(Of String)("album").ToLower()).containsArray(strKeywords) _
    9. And (cd.Field(Of String)("name").ToLower = strCDFilter.ToLower Or strCDFilter = "") _
    10. Order By cd.Field(Of Integer)("nummer"), track.Field(Of Integer)("tracknr") _
    11. Select New With _
    12. { _
    13. .CD = cd.Field(Of String)("name"), _
    14. .Titel = track.Field(Of String)("titel"), _
    15. .Artist = track.Field(Of String)("interpret"), _
    16. .Album = track.Field(Of String)("album"), _
    17. .Nr = track.Field(Of Integer)("trackNr") _
    18. }
    19. dtSource = query.CopyToDataTable()
    20. dgvData.DataSource = dtSource

    Vielleicht noch kurz zum Erklären:
    • dgvData = Mein DataGridView
    • track.Field(Of String)("album").ToLower()).containsArray(strKeywords) = Eigene Extension zum prüfen ob alle Werte aus strKeywords (String-Array) in dem String vorhanden sind. Gibt True oder False zurück.
    • query.CopyToDataTable = Anwendung oben genannter "Object Shredder"
    Ich hoffe ich konnte euch mein Problem verständlich erklären. Falls das schon behandelt wurde und ichs nur nicht gefunden habe, schlagt mich bitte mit den Suchbegriffen oder Links =P
    Und falls ich was vergessen habe zu schreiben einfach Fragen, danke :D

    Eine kleine Bitte noch, das sind meine ersten Versuche, also wenn da grobe Fehler drin sind bitte ich um einen kleinen Hinweis.


    Aus den Tipps und Tricks verschoben
    -Artentus
    Bilder
    • ERM DataSet.png

      7,07 kB, 606×319, 87 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()

    lass Linq2Dataset erstmal komplett beiseite, und arbeite dich in die konventionelle Datenverarbeitung typisierter Datasets ein: vier Views-Videos komplett durcharbeiten.
    Bei "Coden in typisierter Manier" wirst du auch feststellen, wie weit du davon entfernt bist.

    Und - ja - gejointe Datensätze sind prinzipiell nicht rückspeicherbar, denn das Joinen macht aus 2 existierenden Tabellen eine Auflistung von Datensätzen, für die keine Tabelle existiert (in die man was zurückschreiben könnte).
    gugge die Filme - es gibt besseres, nämlich JoiningViews mit DatagridViewComboboxColumns - und alles geht noch ganz konventionell ohne Linq.

    Also nix gegen Linq - kann man schöne Sachen mit machen, zB. Linq2Dataset-Filter.
    Aber das ist schon bisserl advanced, und vorrangig empfehle ich erstmal sich die konventionelle Dataset-Technologie zu erarbeiten - die 4Views sind ja auch noch nicht Ende der Fahnenstange, fehlen ja noch DataExpressions und Dataset-Erweiterungen mittels partialer Klasse.