Linq - DataGridView - Effektiv verknüpfen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Rainman.

    Linq - DataGridView - Effektiv verknüpfen

    Hallo zusammen,

    ich hab mal die Forum-Suche bemüht und ein paar interessante Beiträge gefunden, was die Themen Linq <-> DataGridView angeht.

    Allerdings konnte ich zu meinem Problem nichts finden:

    Ich möchte Linq-Abfragen in DataGridViews anzeigen und manipulieren. Allerdings nur bestimmte Spalten aus der Abgefragten Tabelle der Linq-Abfrage. Und diese sollten sich auch aktualisieren.

    Hier mal mein erster Lösungsansatz:

    VB.NET-Quellcode

    1. Private Sub Mitarbeiter_DoubleClick(sender As Object, e As EventArgs) Handles MitarbeiterTreeView.NodeMouseDoubleClick
    2. Cursor = Cursors.WaitCursor
    3. Dim AzAcBinding As New BindingSource
    4. Dim UID As Integer = CInt(MitarbeiterTreeView.SelectedNode.Name)
    5. Dim AzAc = From Result In DB.PAAzAc
    6. Where Result.Rohdaten.PAInternUID = UID
    7. Select Result
    8. DB.Refresh(Data.Linq.RefreshMode.OverwriteCurrentValues, AzAc)
    9. AzAcBinding.DataSource = AzAc
    10. AzAcNavigator.BindingSource = AzAcBinding
    11. AzAcDataGridView.DataSource = AzAcBinding
    12. Cursor = Cursors.Default
    13. End Sub


    So Funktioniert alles... Allerdings wird mir so auch jede Tabellenspalte ausgegeben

    Mein zweiter lösungsansatz:

    VB.NET-Quellcode

    1. Private Sub Mitarbeiter_DoubleClick(sender As Object, e As EventArgs) Handles MitarbeiterTreeView.NodeMouseDoubleClick
    2. Cursor = Cursors.WaitCursor
    3. Dim AzAcBinding As New BindingSource
    4. Dim UID As Integer = CInt(MitarbeiterTreeView.SelectedNode.Name)
    5. Dim AzAc = From Result In DB.PAAzAc
    6. Where Result.Rohdaten.PAInternUID = UID
    7. Select Firma = Result.AzAcFirm,
    8. Account = Result.AzAcAcc
    9. DB.Refresh(Data.Linq.RefreshMode.OverwriteCurrentValues, AzAc)
    10. AzAcBinding.DataSource = AzAc
    11. AzAcNavigator.BindingSource = AzAcBinding
    12. AzAcDataGridView.DataSource = AzAcBinding
    13. Cursor = Cursors.Default
    14. End Sub


    Hierbei bekomme ich zur Laufzeit folgende Fehlermeldung:
    Spoiler anzeigen
    InvalidOperationException wurde nicht behandelt.
    Der Typ "VB$AnonymousType_0`2[System.String,System.String]" ist nicht als "Table" zugeordnet.


    Irgendwo nachvollziehbar... Ich wähle nur spezifische Spalten aus, daher ist es vielleicht keine vollständige "Table" mehr. Allerdings wüsste ich nicht wie ich es retten kann.

    Lasse ich

    VB.NET-Quellcode

    1. DB.Refresh(Data.Linq.RefreshMode.OverwriteCurrentValues, AzAc)
    weg, geht es. Er zeigt nur die Spalten an, die ich will. Allerdings sind diese dann nicht mehr bearbeitbar. Und aktualisieren tun sie sich natürlich auch nicht.

    Hat jemand Ideen was ich falsch mache? Oder wie ich es besser machen kann?

    Arbeite zur Zeit dieses Buch durch: Datenbankprogrammierung mit Visual Basic 2012 leider hilft es in diesem Zusammenhang wenig. Oder ich find die richtige Stelle nicht :S

    Vielen Dank schon mal an die, die sich der Sache annehmen! ;)

    Gruß,
    Hendrik
    Der Vorteil der Intelligenz besteht darin, sich dumm stellen zu können. Das Gegenteil davon ist schon schwieriger.
    Nett...

    Anstatt mir zu erzählen, das meine Lösung "Crap" ist, sag mir doch bitte lieber wie es richtig geht!
    Ich bin neu in Datenbankprogrammierung und will mich weiter bilden. Und du erzählst mir das meine "Anfangsideen(!)" scheiße sind...

    Ich habe einige Beiträge gefunden in denen Linq und DataGridViews zusammen spielen. Gut... Da war teilweise auch noch die Rede von DataTables usw.

    Allerdings verschließt sich mir der Sinn, solche Elemente zwischen Linq und einer DataGridView zu setzen. Ich lasse mich selbstverständlich gerne belehren! Aber bis jetzt "funktioniert" es ja auch so. Nur das eben alle Spalten der Tabelle angezeigt werden.

    Ich wäre dankbar für eine aussagekräftige Antwort, warum ich Linq nicht mit einer DataGridView verwenden kann, und wie man es "richtig" machen könnte.

    Gruß,
    Hendrik
    Der Vorteil der Intelligenz besteht darin, sich dumm stellen zu können. Das Gegenteil davon ist schon schwieriger.
    Du verlangst eine zielführendere Antwort, aber meine Frage zu beantworten bist du nicht bereit?

    Weil die Frage ist zielführend

    Yunkie schrieb:

    Da war teilweise auch noch die Rede von DataTables usw.
    Vermutlich hätte sich gezeigt, dass in den Beiträgen ühaupt nicht von Linq to Datagridview die Rede ist, sondern aussschließlich von LinqToDataset.


    Wenn du typDataset aber nicht verstehst, dann braucht man dir mit LinqToDataset gar nicht erst kommen.

    Vielleicht beschäftigst du dich erstmal mittm typisierten Dataset: Daten laden, speichern, verarbeiten, vier Views-Videos, DataExpressions

    Wenn man mit diesem Instrumentarium nicht mehr weiterkommt, dann wirds Zeit, sich an LinqToDataset zu wenden.



    naja, nochmal von vorne:
    Es gibt eine Technologie, die heißt "LInqToDataset", und damit kann man Abfragen ans typisierte Dataset erstellen und pipapo.
    Es gibt keine Technologie "LinqToDatagridView".
    typisiertes Dataset ist das Kern-Objekt von ADO.Net, in diese Technologie sollteste dich unbedingt einarbeiten. Gugge die angegebenen Tutorials, dann verstehst du vlt. auch, warum es fabelhaft ist, solch Zeug zwischen Oberflache und Daten-Backend zu schieben.

    Sei froh, dass jmd dir gleich am Anfang sagt, dein Ansatz ist Crap, was meinst du wieviele Probleme du hättest, wenn du erst innem halben Jahr drauf kommst?

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

    Damit hab ich doch, was ich wollte... Einen Weg, wie es "richtig" geht...

    Ich werde mir nun die genannten Tut's reinziehn und harre der Dinge, die da kommen...

    Vielen Dank erstmal!


    Gruß,
    Hendrik
    Der Vorteil der Intelligenz besteht darin, sich dumm stellen zu können. Das Gegenteil davon ist schon schwieriger.
    Ich weiß, das Ding hier ist schon etwas älter, was dadurch aber nicht an Aktualität verliert.

    Ich experimentiere gerade ebenfalls mit LINQ und Datagridview rum. Ich meinem Fall lasse ich ein Dataset komplett weg.

    Ich lese die Daten über über eine LinqtoSQL-Klasse ein. Die dbml besteht recht einfach aus einer Tabelle einer Datenbank von einem SQLServer2008R2

    das habe ich jetzt und funktioniert perfekt. Die Daten werden geladen und ich kann die Daten im Grid bearbeiten. Mehr solls auch nicht sein.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Package As New DataClasses1DataContext
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. dgv.DataSource = From Packages In Package.VORGPOSPACKAGE


    Jetzt geht es um die anfängliche Bemerkung von Yunkie.
    Sobald ich einzelne Felder selektiere funktioniert die Bearbeitung der Daten nicht nicht mehr.Und das will mir nicht in meinen Schädel. Ich habe jetzt

    VB.NET-Quellcode

    1. dgv.DataSource = From Packages In Package.VORGPOSPACKAGE
    2. select Packages.ID, Packages.Name


    Mir gehts noch nicht mal darum, dass das sofort in die DB zurückgeschrieben werden soll. Sondern einfach nur, warum kann ich jetzt nicht mehr bearbeiten?

    Ich habe das Buch "Datenbankprogrammierung mit Visual Basic 2012" von Walter Doberenz und Thomas Gewinnus (ISBN 978-3-86645-467-5) gewälzt aber keinen Hinweis gefunden.
    Das "select" in der Linq-Abfrage erzeugt einen anonymen Typ und mit dem scheint dann einiges nicht mehr möglich zu sein.
    Mögliche Abhilfe: eine Dummy-Klasse anlegen. (Es gibt noch viele andere Lösungswege, das ist nur einer davon).

    VB.NET-Quellcode

    1. Class dummy
    2. Property ID As Long
    3. Property Name As String
    4. End Class

    Und dann die einzelnen Felder abbilden:

    VB.NET-Quellcode

    1. dgv.DataSource = From Packages In Package.VORGPOSPACKAGE
    2. select new dummy with { .ID =Packages.ID, .Name = Packages.Name }

    Ggf. noch .ToList hinzufügen wenn das Databinding nicht funzt, kann es grad nicht testen ...
    An manchen Tagen gibt es zu allem Überfluss auch noch Ärger!