m:n Beziehung Datagridview

  • VB.NET
  • .NET 4.5

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    m:n Beziehung Datagridview

    Guten Abend,

    ich habe folgendes Problem:

    Ich möchte meine Anwendung (ist ein Übungsprojekt) erweitern.

    Im ersten Schritt hab ich ein Dataset mit folgender Konfiguration gehabt:

    Kategorie -1:n- Orte -1:1- Erfahrung

    Ich konnte in einem Datagridview eine Kategorie auswählen, im nächsten wurden dann alle Orte der jeweiligen Kategorie angezeigt und zu dem Ort konnte ich dann auch einen Erfahrungsbericht zuordnen.

    Das hat auch gut funktioniert.

    Jetzt möchte ich es erweitern um die Tabelle Personen (mehrere Personen können zu einem Ort einen Erfahrungsbericht schreiben). Jetzt gibt es ja zu einem Ort mehr als einen Erfahrungsbericht

    Also sieht das Datenbank Schema ja so aus:

    Kategorie -1:n- Ort -1:n- Erfahrung
    ........................................I
    ........................................I
    ....................Person - - - 1:n -

    Siehe auch beigefügtes Bild.
    Jede Person soll zu jedem Ort genau einen Erfahrungsbericht schreiben können.

    Ich würde gerne die Person über eine Combobox auswählen und eine Textbox haben in der die Person den Erfahrungsbericht schreiben kann.
    Über einen Button kann der nächste Ort ausgewählt werden (OrtBindingsource.movenext()) wobei die Person in der Combobox gleich bleibt. Ist man nun bei Ort xy und wählt eine andere Person aus, so wird der entsprechende Erfahrungsbericht in die Textbox geladen.

    Wie gesagt, das was ich vorher aufgebaut habe lief super, aber jetzt mit der zusätzlichen Abhängigkeit für den Erfahrungsbericht bekomme ich es nicht mehr zum laufen.

    Ich habe eine Combobox mit Databinding hinzugefügt und es klappt wenn ich einen Ort auswähle, in der Combobox eine Person auswähle, dass dann der Erfahrungsbericht mit der entsprechenden PersonID gespeichert wird. Aber wenn ich jetzt die Person ändere dann wird der Datensatz geändert (ich sehe den Erfahrungsbericht von Müller und will über die Combobox den von Schulze auswählen. Wenn ich die Combobox ändere wird allerdings der Erfahrungsbericht von Müller Schulze zugeordnet. Ich hoffe man versteht was ich erkläre.)

    Ich komme mittlerweile schon ganz gut mit VB.net zurecht - aber diese Datenbankstrukturen bzw. Datasets sind echt noch schwere Kost für mich. Ich habe bereits die ganzen einschlägigen Tutorials durch (dadurch und ein bisschen mit Eurer Hilfe in der Vergangenheit habe ich das was bisher funktioniert hinbekommen ;) )

    Ich hoffe ihr könnt mir auf die Sprünge helfen worauf ich achten muss. Ich sehe das Problem in der erzeugten m:n Beziehung? Dort passiert das was nicht will...

    Grüße

    Philipp
    Bilder
    • Unbenannt.GIF

      62,49 kB, 786×437, 20 mal angesehen
    Vermutlich kennste das schon, aber ich erwähns trotzdem nochmal: vier Views-Videos
    Da gibts ein Filmle, namens m:n-View.
    Dein Datenmodell ist auch bereits dafür geeignet.
    Nur eines:

    Philipp schrieb:

    Jede Person soll zu jedem Ort genau einen Erfahrungsbericht schreiben können.
    Auch das ist korrekt modelliert, mit der Einschränkung, dass - nach dem Datenmodell - jede Person auch mehrere Erfahrungen zum selben Ort zuordnebar sind.
    Um solch zu verhindern muss man im Gui listige Sachen coden, aber sieh mal erstmal zu, dass du ühaupt den m:n-View hinbekommst - du bist da auffm richtigen Weg.

    Was immer hilfreich ist: Wenn du schoma ein paar Datensätze eintragen kannst, und speichern und laden in eine Xml-Datei.

    Ich hab die 4-Views-Theorie auch noch woanners erläutert, ausführlicher, aber englisch und mit viele Bilder statt film:
    codeproject.com/Articles/1033145/Databinding-for-Beginners

    Philipp schrieb:

    ich sehe den Erfahrungsbericht von Müller und will über die Combobox den von Schulze auswählen. Wenn ich die Combobox ändere wird allerdings der Erfahrungsbericht von Müller Schulze zugeordnet.
    Das ist das Standardverhalten des datengebundenen DGVs. Du bearbeitest eine wieauchimmerzusammengesetzte Datenzeile. a-shot-into-the-blue: Dass Du bei Änderung des Combobox-Spalten-Wertes den in Deinen Gedanken dazugehörigen TextBox-Wert in der danebenliegende TextBox-Spalte erhältst, geht nicht ohne zusätzlichen Code. Aber dazu müsstest Du die TextBox-Spalte m.E. von der aktuellen Datenzeile abtrennen, also ungebunden machen und über Code befüllen bzw. abspeichern.

    ##########

    Ach Moment. Du bist ja gar nicht in nem DGV unterwegs. Du arbeitest ja mit ComboBox, TextBox und Co.

    ##########

    Ok, jetzt bin ich doch verwirrt. Du schreibst im Titel: DGV. Im Text redest Du über ComboBox, und Co. womit arbeitest Du nun?
    Denn es ist nicht (ohne zusätzlichen Code) möglich, nur ne Orts-ComboBox, ne Personen-ComboBox und ne TextBox zu haben und in dieser einen Erfahrungsbericht der ausgewählten Person für jenen Ort anzeigen zu lassen, da es designbedingt zwischen 2 Tabellen keine 1:1-Beziehung geben kann, sondern immer nur eine 1:N. Man kann zwar EInschränkungen im Code einbauen, dass das dann doch so ist. Und wenn wenn man keine Zwischentabelle hätte, könnte man sogar im tDS-Designer einstellen, dass es eine 1:1-Beziehung darstellen soll, indem man die Foreign-ID die Unique-Property verpasst. Da Du aber eine M:N-Relation hast, ist es vom Design her möglich, dass zu einem Ort eine Person X Erfahrungsberichte schreibt. Und daher kann ohne zusätzlichen Code der Compiler nicht entscheiden, welcher Erfahrungsbericht in der Textbox angezeigt werden soll, wenn ein Ort und eine Person gewählt wurde.

    Irgendwie werd ich aber das Gefühl nicht los, dass ich doch nicht ganz erfasst habe, wie Deine CE-Ist-Situation momentan aussieht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“ ()