Dataset, relationen und DataGridView

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Frettchen1982.

    Dataset, relationen und DataGridView

    Hallo Forengemeinde,

    ich suche schon seit Tagen eine Lösung und finde sie einfach nicht.

    Ich habe eine access DB mit 2 Tabellen. (Stelle das jetzt mal vereinfacht dar)

    Kunden: Nummer, Name, BearbeiterID
    Bearbeiter: BearbeiterID, BearbeiterName, BeabeiterMail

    Jetzt habe ich ein (Typisiertes) DataSet erstellt im Designer und beide Tabellen dort hinein gezogen. Dann habe ich mit Hilfe der Tollbox eine Relation eingefügt für die BearbeiterID

    In meiner Form habe ich ein DataGridView. Eine der Tabellen bekomme ich da auch problemlos angezeigt, auch mit BindingSourece etc.
    Kann Datensätze ändern und wieder zurück in die DB speichern, filtern usw.

    Aber was muss ich machen, damit das DGV folgdendes anzeigt:

    Nummer, Name, BearbeiterName, BearbeiterMail

    Mit manuellen Abfragen etc. würde es bestimmt irgendwie gehen, aber es muss doch da was einfacheres geben?

    Wer kann helfen?
    versuche soetwas mit LINQ umzusetzen:

    VB.NET-Quellcode

    1. DeinDGV.DataSource = (From r1 In DeinDataset.Kunden Join r2 In DeinDataset.Bearbeiter On r1.BearbeiterID Equals r2.BearbeiterID
    2. Select New With {.Nr = r1.Nummer, .Name = r1.Name, .Bearbeiter = r2.BearbeiterName, .Mail = .r2.BearbeiterMail}).ToList
    Vielleicht reicht ja schon, beide Tabellen als Datamember anzugeben. Überflüssige Spalten kannst Du dann ausblenden.

    VB.NET-Quellcode

    1. DeinDataGridView.DataMember = "Tabelle1, Tabelle2"
    Das Leben ist nicht so kompliziert. Eine süsse Erinnerung tut's.
    Indiana Jocutus - Jäger des Variablen-Schatzes
    @VB1963:: das wäre eine Lösung, wo man nix eintragen kann, weils nicht mehr rückspeicherbar ist.

    @jocutus:: hast du das mal ausprobiert? Wenn das ginge, das würde mir ja ganz neue Türen eröffnen. Aber ich bezweifel stark, dass das geht.

    @TE: Du machst keine Angabe zur DataRelation, wie du sie eingerichtet hast. Die einzig denkbare Variante, die richtig wäre wäre Bearbeiter->Kunde, also ein Bearbeiter hat mehrere Kunden.
    Komisches Datennmodell, denn normalerweise gibts immer eine Zwischentabelle für das Bearbeitete zwischen Bearbeiter und Kunden, aber seis drum.

    Also unter Vorraussetzung obiger Hypothesen willst du nix anneres als einen JoiningView (guck - @VB1963:'s Code spricht auch vom joinen), und post#2 verlinkt ganz richtig auf ein Tutorial mit SampleSolutions mit einigen diesbezüglichen Beispielen.
    Der Ansatz ist, eine ComboboxDatagridViewColumn ins DGV einzubauen - dazu kanns keinen Code geben, weil das macht man im Form-Designer.
    In meinem Fall hatte ich mit 'INNER JOIN' eine SQL-Abfrage über 2 Tabellen erstellt und die Ergebnisse in ein Dataset getan...

    VB.NET-Quellcode

    1. db = New SqlDataAdapter(cmd)
    2. Dim ds As New DataSet
    3. db.Fill(ds, "Tabelle1, Tabelle2")
    4. DataGridView.DataSource = ds
    5. DataGridView.DataMember = "Tabelle1, Tabelle2"


    Edit: Wobei ich jetzt nicht genau weiss, warum ich ein Dataset genommen habe. (Ich bin blutiger Anfänger...) :whistling:
    Das Leben ist nicht so kompliziert. Eine süsse Erinnerung tut's.
    Indiana Jocutus - Jäger des Variablen-Schatzes
    deine codes sehen mir immer abenteuerlicher aus - kannste mir noch den CommandText des cmd geben?

    vlt. Screenshot vom Ergebnis, was das DGV dann anzeigt?



    Also nach meim Verständnis geht das nicht, und so reagiert auch mein VS:
    Bilder
    • Shots01.Png

      32,25 kB, 454×334, 174 mal angesehen

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

    Also:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim cmd As New SqlCommand("Select HTKunden.KNummer, KName, K2Name, KOrt, HTKunRest.KLOrt, HTKunRest.KROrt, KZahlKon from HTKunden iNNER JOIN HTKunRest ON HTKunden.KNummer = HTKunRest.KNummer Order By KName", conn)
    2. db = New SqlDataAdapter(cmd)
    3. Dim ds As New DataSet
    4. db.Fill(ds, "HTKunden, HTKunRest")
    5. dgvKunde.DataSource = ds
    6. dgvKunde.DataMember = "HTKunden, HTKunRest"



    Lieferort und Rechnungsort sind aus der 2.Tabelle.

    In Deinem Bild sagt er "für Feld Category und Article" aber es sollten die Tabellen angegeben werden, oder?
    Bilder
    • forum.jpg

      34,82 kB, 840×114, 142 mal angesehen
    Das Leben ist nicht so kompliziert. Eine süsse Erinnerung tut's.
    Indiana Jocutus - Jäger des Variablen-Schatzes

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

    ah, ja.
    du legst da im Dataset nur eine einzige Tabelle an, unter dem eigentümlichen Namen "HTKunden, HTKunRest". Sieht aus, als würde das 2 Tabellen bezeichnen, aber es ist nur eine.
    probierma

    VB.NET-Quellcode

    1. Dim cmd As New SqlCommand("Select HTKunden.KNummer, KName, K2Name, KOrt, HTKunRest.KLOrt, HTKunRest.KROrt, KZahlKon from HTKunden iNNER JOIN HTKunRest ON HTKunden.KNummer = HTKunRest.KNummer Order By KName", conn)
    2. db = New SqlDataAdapter(cmd)
    3. Dim ds As New DataSet
    4. db.Fill(ds, "HTKunden, HTKunRest, Oma auf Butterfahrt")
    5. dgvKunde.DataSource = ds
    6. dgvKunde.DataMember = "HTKunden, HTKunRest, Oma auf Butterfahrt"
    müsste auch gehen, wennich mit meine Theorie richtig liege.
    Jo. Oma auf Butterfahrt geht auch. Und ein Name geht auch.
    Mea culpa. Die Abfrage generiert nur eine Tabelle, der Name ist dann wohl Nebensache. 8|

    Alles, was im Dataset ist, sollte auch angezeigt werden. Wenn das DataGridView nicht manipuliert ist. Bei meinem "INNER JOIN" werden nur Datensätze angezeigt, die in
    beiden Tabellen vorhanden sind (genauer gesagt, wenn in beiden ein Eintrag mit der Kundennummer ist.).
    Das Leben ist nicht so kompliziert. Eine süsse Erinnerung tut's.
    Indiana Jocutus - Jäger des Variablen-Schatzes
    Also schonmal vielen Dank für die Antworten.



    ErfinderDesRades schrieb:

    Der Ansatz ist, eine ComboboxDatagridViewColumn ins DGV einzubauen - dazu kanns keinen Code geben, weil das macht man im Form-Designer.
    Das habe ich auch gesehen das es so geht und habe es jetzt erstmal damit gemacht.

    ErfinderDesRades schrieb:

    @TE: Du machst keine Angabe zur DataRelation, wie du sie eingerichtet hast. Die einzig denkbare Variante, die richtig wäre wäre Bearbeiter->Kunde, also ein Bearbeiter hat mehrere Kunden.
    Komisches Datennmodell, denn normalerweise gibts immer eine Zwischentabelle für das Bearbeitete zwischen Bearbeiter und Kunden, aber seis drum.

    Sorry. Ja genau so ist die angelegt. Mit der Zwischentabelle hätte ich jetzt nicht gerechnet. Werde mir das andere Thema mal gemütlich reinziehen.

    Aber ihr habt mir schon einiges geholfen. :thumbsup: