Dataset m:n-View Darstellung in nur 2 DGV‘s

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

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

    Dataset m:n-View Darstellung in nur 2 DGV‘s

    Hallo,
    ich beziehe mich hier bei meiner Frage auf das Video Film VI – m:n-View vom ErfinderDesRades, welches sehr anschaulich eine solche Beziehung mit Hilfe von 4 DGV’s darstellt.

    Mein Datenbasis entspricht im Wesentlichen dem oben genannten Beispiel, weshalb ich hier auch die gleichen Begriffe verwenden möchte.

    Da aber in meinem Fall die „Artikel-Tabelle“ nur der Verknüpfung von „Kategorie“ und „Lieferant“ dient und keine weiteren Informationen enthält, möchte ich das Ganze nur mit 2 DGV’s Visualisieren.
    Im linken DGV stehen die Daten, welche die „Kategorie“ enthalten und im rechten DGV sollen die „Lieferanten“ dazu aufgelistet werden.
    Wie kann ich das bewerkstelligen?

    Wobei in meinem Fall die die „Kategorie-Tabelle“ noch mehrere von einander abhängige übergeordnete Tabellen hat.
    Bis zur testweisen Darstellung der „Artikel“, welche ich ja eigentlich nicht benötige, funktioniert das Modell.

    Nun komme ich aber nicht weiter….

    Ich hoffe ich habe mein Problem verständlich dargestellt und danke euch schon im Voraus für eure Hilfe :) :) :)

    Hofi1609
    Willkommen im Forum.
    Das geht nicht ohne Code. Letztenendes müsstest Du über den Kategorie-BindingSource-CurrentChanged-EventHandler (am besten per LINQ) festlegen, welche Lieferanten angezeigt werden. Und vice versa.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    hmm - prinzipiell kann man einen m:n-View in 2 DGVs darstellen - rein im Designer designed - ohne UserCode.
    In meim Film sinds nur deswegen 4 DGVs, weil ich einmal die Personen in Abhängigkeit ihres Berufes anzeigen, und ein andermal die Berufe in Abhängigkeit der Personen.

    Also wenn dein Datenmodell wirklich so ist, wie du sagst, kannst du die Lieferanten in Abhängigkeit der Kategorien anzeigen - in 2 DGVs - kein Problem, und ich empfehle, das auch ohne UserCode zu tun.
    Wenn du dabei alle Lieferanten-Eigenschaften sehen willst, musste halt so viele ComboboxDatagridviewColumns einbasteln, wie Lieferant Spalten hat (ausser Schlüsselspalten PK, FK - die will keiner sehen).
    Sorry, dass ich mich jetzt erst melde, bin aber nicht eher dazugekommen den Tipp vom "ErfinderDesRades" zu testen.
    Das Ergebnis, ein DGV voller ComboboxDatagridviewColumns sieht zwar nicht so schön aus, aber es funktioniert ;) , danke für die Hilfe.

    Nun habe ich aber eine neue Herrausforderung, vielleicht könnt Ihr mir da auch helfen:
    Ich habe links eine Tabelle "Daten" welche unter anderem die zwei Spalten "Genre" und "Category" enthält, in denen jeweils eine Ziffer steht.
    Recht habe ich die Tabelle "Content" welche aus folgenden Spalten besteht: ID; Category; Genre; Description.
    Es gibt zu jeder Kategorie 16 (0-15) Genre deren Name in Description steht, Bei Genre = 0 enthält Description den Namen der Category.

    Wie kann ich nun mit 2 Comboboxen oder mit DGB und ComboboxDatagridviewColumns, links die Category und rechts das Genre aus der Tabelle Daten anzeigen?
    Wichtig ist, dass im CategoryDropDown nur die Zeilen aus Content angezeigt werden bei denen Genre = 0 ist und in GenreDropDown nur die wo Category = Auswahl CategoryDropDown ist.

    Gibt es eine Lösung ohne programmieren?

    VG Hofi1609

    Hofi1609 schrieb:

    ein DGV voller ComboboxDatagridviewColumns sieht zwar nicht so schön aus
    Wieso nicht?
    Wenn man ComboboxStyle.Nothing (oder so ähnlich) festlegt ist eine ComboboxColumn von einer TextboxColumn optisch nicht zu unterscheiden.

    Deine Beschreibung kann ich nicht sicher verstehen, und meine Beschreibung einer Lösung wäre vmtl. noch unverständlicher.
    Kannst du vlt. eine Solution anhängen, die das Problem reproduziert?
    Aber auch ein Bildle des Datenmodells im DatasetDesigner wäre hilfreich.
    Zum Anhängen solcher Dinge:
    Das hatte ich mir fast gedacht.... ;)

    Was meinst du mit einer Solution?

    Aber ein paar Bilder kann ich liefern, eventuell verdeutlichen sie das Problem:


    Hier mein komplettes Datenmodell.
    Das DS ist über mysql an eine MariaDB10 angebunden und wird nur für die Visualisierung der Daten benutzt.
    Erstellt werden die Daten durch diverse Importe und Scans aus anderen Quellen direkt per SQL.

    Die Problemstelle:

    Die beide gezeigten reinen Beziehungen scheinen aber so nicht zu funktionieren???

    Hier noch ein Auszug aus der Tabelle "smConten" der den Aufbau verdeutlichen soll:

    Ich weiß, dass das Design hier nicht gerade clever ist, aber der Aufbau dieser Tabelle wird von einem importiertem Standard so vorgegeben, welchen ich einfach übernommen habe. ;)

    So, ich hoffe das hilft für das Verständnis meines Problems.

    Gruß Hofi1609

    Hofi1609 schrieb:

    Wie kann ich nun mit 2 ComboboxDatagridviewColumns, links die Category und rechts das Genre aus der Tabelle Daten anzeigen?
    Dein Dataset zeigt 2 Relationen zwischen den Tables - die müssen ja unterschiedliche ForeignKeys definieren.
    Problemlösung: Die eine DGVComboColumn "folgt" der einen Relation, die anmdere der anderen.
    Wenn du schomal eine DGVComboColumn erfolgreich eingerichtet hast, sollte die zweite einzurichten proinzipiell kein Problem sein.
    Dran denken: Jede ComboColumn verlangt ihre eigene BindingSource (auf in diesem Falle dieselbe ParentTable). Sonst beeinflussen sich die Auswahlen gegenseitig.

    Das "Folgen" einer bestimmten Relation geschieht über das Festlegen von DGVComboColumn.ValueMember (welche den ForeignKey bezeichnet). (s. 4-View-Tuts, kennste, oder?)



    Ähm - insgesamt ist das aber ein glaub vermurkstes Datenmodell, wenn Category und Genre in derselben Tabelle "bereitgestellt" werden.
    (Was ist ühaupt der Unterschied zw. Kategorie und Genre??)

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

    ErfinderDesRades schrieb:

    Ähm - insgesamt ist das aber ein glaub vermurkstes Datenmodell, wenn Category und Genre in derselben Tabelle "bereitgestellt" werden.

    Da bin ich vollkommen deiner Meinung, aber wie schon beschrieben habe ich das einfach übernommen aus "ETSI EN 300 468" (Seite 53). Glücklich bin ich damit auch nicht und ich bin am überlegen ob ich das noch etwas besser gestallten sollte. Die Vorgabe lässt auch nur genau einem Wert (Kategorie/Genre) pro Film zu, was aber in der Realität viel zu "grob" ist.

    ErfinderDesRades schrieb:

    (Was ist ühaupt der Unterschied zw. Kategorie und Genre??)

    Hier streiten sich die "Götter" es gibt keinen Standard und jeder macht das anders, siehe de.wikipedia.org/wiki/Kategorie:Filmgenre und de.wikipedia.org/wiki/Filmgenre. Auch die Begriffe Genre und Kategorie werden je nach benutzter Quelle unterschiedlich definiert.
    Man kann es aber grob als Filmkategorie und diverse Subkategorien ansehen...

    Zu deiner Lösung: (vielen Dank)
    Dem kann ich aber nicht so ganz folgen. Im Kategorie-DGV dürfen ja nur die Datensätze enthalten sein, welche bei Genre = 0 sind, wobei der Datensatz aus smEitData über ed_Category ausgewählt sein soll.
    Im Genre-DGV wiederum, sollen nur die Datensätze enthalten sein welche die oben ausgewählte Kategorie enthalten, wobei hier der Inhalt von ed_Genre ausgewählt sein soll.

    Jede ComboColumn verlangt ihre eigene BindingSource (auf in diesem Falle dieselbe ParentTable). Sonst beeinflussen sich die Auswahlen gegenseitig.

    Wenn ich die Kategorie wechsle muss sich natürlich auch der Inhalt von Genre ändern, Genre ist also von Kategorie abhängig.

    Gruß Hofi1609

    Hofi1609 schrieb:

    Wenn ich die Kategorie wechsle muss sich natürlich auch der Inhalt von Genre ändern, Genre ist also von Kategorie abhängig.
    Dann nimmst du eben für beide ComboColumns dieselbe BindingSource (und lässt sie dennoch je ihrer Relation folgen).
    (kann allerdings sein, dass dann die jeweils annere ComboZelle nicht sofort refresht (Bug))
    OK, vielen Dank vorerst.
    Im Moment komme ich leider nicht dazu an meinem Projekt weiter zu machen.
    Ich werde aber in den nächsten Tagen deine Vorschläge mal ausprobieren und mich dann wieder hier melden.

    Wenn ich noch zwei oder dreimal darüber schlafe, entschließe ich mich eventuell den ganzen Vorgang einfach zu ändern, dann hätte sich das Problem ohnehin gelöst.

    Viele Grüße Hofi1609
    Ein neuer Job und andere Projekte habe mich leider bis jetzt so beschäftigt, dass ich hier nicht weitermachen konnte. In Zeiten von Kurzarbeit :( kann ich mich aber wiedermal um das Projekt kümmern.

    Da tut sich gleich ein neues Problem zum eingangs genanntem Thema auf, wo ich einfach nicht weiter komme und eure Hilfe benötige.

    Bei meinem DataSet-Design (Bild 2 auf Post #7) bin ich davon ausgegangen, dass jeder Episode n Dateien (Aufnahmen) zugeordnet werden können aber jede Datei kann genau einer Episode zugeordnet werden.
    Leider musste ich nun feststellen dass das so nicht stimmt, da im TV sehr häufig Doppel-Folgen ausgestrahlt werden. Diese werden als eine Datei aufgenommen und müssen dann 2 oder mehr Episoden zugeordnet werden.
    Das bedeutet, dass zwischen der Tabelle Episoden und FileDaten eine n:m Beziehung bestehen muss.

    Nach dem ich mir nun eine Hilfstabelle Namens File2db erstellt habe, welche neben der eigenen ID nur die IDs von Episode und FileData enthält, sieht mein Modell nun wie folg aus(Auszug):



    In meiner GUI habe ich von allen Haupttabellen ein DGV mit den wesentlichen Feldern zum auswählen der Daten und diverse Textfelder etc. für die Detailansicht und zum bearbeiten der Daten.
    Das funktioniert auch alles sehr gut bis zu der neuen Hilfstabelle File2db, ab hier komme ich nicht mehr weiter.

    Ich kann zwar noch nach dem Rezept vom @ErfinderDesRades die zugehörigen Files in einem DGV anzeigen, aber der Datasource dieser Tabelle beruht ja auf der Hilfstabelle.

    Das heißt egal welche Episode oder welches File ich auswähle, der Datensatz-Zeiger an den FileDaten ändert sich nicht und damit werden auch die an die FileDate Tabelle gebundenen Tabellen und ihre Nachfolger nicht verändert.

    Ich hab schon alles mögliche zum Thema n:m gelesen, kann aber keine Lösung finden ?( oder ich bin schon Betriebsblind ;)

    Kann mir hier jemand auf die Sprünge helfen?

    Viele Grüße und vielen Dank im Voraus, Hofi1609

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

    OK, dann frage ich mal anders.

    Gehe wir mal davon aus, dass ich an jede der oben gezeigten Tabellen ein DGV gebunden habe.
    Wenn ich nun eine Zeile im DGV-Episode auswähle, dann verändert sich der Inhalt von DGV-File2db.
    Der Inhalt der FileDate-DGV aller darauf folgenden DGVs bleibt aber gleich, nämlich alle Daten der jeweiligen Tabellen.

    Ich möchte aber dass beim klicken auf eine Zeile im DGV-Episoden bzw. DGV-File2db auch der Inhalt von DGV-FileData, CUT-Data, Meta-Data und EIT-Data nur die Daten zur aktuell ausgewählten Zeile aus der DGV-File2db angezeigt wird.
    In einem untergeordnetem DGV(Tabelle) werden ja immer nur die Daten angezeigt, welche auf den übergeordneten Datensatz verweisen.
    Bei einer 1:n-Beziehung funktioniert das ja automatisch über die Bindingsource aber ab der n:1-Beziehung zwischen File2db und FileData funktioniert das nicht mehr.

    So, ich hoffe nun habe ich das Problem etwas deutlicher rüber gebracht.

    Die gleiche Frage wurde übrigens hier Typisiertes Dataset mit n:m Relation in zwei DataGridView darstellen im ersten Teil schon einmal gestellt.
    Leider seid ihr aber vom Thema abgewichen und habt die Frage nicht eindeutig beantwortet.

    ErfinderDesRades schrieb:

    Wieso sollte sich etwas verändern, allein weil du im DGV was auswählst?

    Die DGVs sind ja alle nach dem Vorbild deiner 4 Videos über entsprechende Bindingsources miteinander verbunden und die Tabellen haben oben gezeigte Relationen.

    ErfinderDesRades schrieb:

    Vor allem: wieso soll sich in File2Db, wenn du in einem Episode-DGV was auswählst?

    Ich meinte natürlich das DGV-File2db.

    Im DGV-FileData habe ich mir mit ComboColumns geholfen, das sieht bis hier hin so aus wie ich mir das vorstelle.
    Aber:
    1. Wie kann ich den Inhalt des aktuell in der DGV-FileData ausgewählten Datensatzes in TextBoxen darstellen?
    2. Wie bekomme ich die ab FileData verknüpften Tabellen (Cuts, EIT,...) vernünftig visualisiert?

    Hofi1609 schrieb:

    Wie kann ich den Inhalt des aktuell in der DGV-FileData ausgewählten Datensatzes in TextBoxen darstellen?
    Du kannst im DatenQuellFenster deine Tabelle umstellen von TabellenAnsicht auf EinzelControls.
    Also da gibts ein klein DropDown daneben, da kannste das machen - bei EinzelControls ändert sich der Icon und sieht bischen aus wie ein Form, und weniger wie eine Tabelle.
    Also wennde das geschafft hast, und ziehst die Tabelle aufs Form dann generiert er Textboxen mit Beschriftung.
    Aber das komtm auf 4Views doch auch vor "DetailView" nenne ich das.

    Hofi1609 schrieb:

    Wie bekomme ich die ab FileData verknüpften Tabellen (Cuts, EIT,...) vernünftig visualisiert?
    Definiere "vernünftig visualisieren".
    Was ist mit Cuts und EIT überhaupt gemeint? Ich seh da in den Screenshots nix. Ah, da oben rechts. Tja, sobald man weiß, was die bedeuten, kann man bestimmt auch was zu Visualisierungsoptionen sagen.

    btw: Wundert micht, dass Du noch gar nicht die ganzen überflüssigen Präfixe in den Tabellennamen und -spalten in Post#12 moniert hast, @ErfinderDesRades.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @ErfinderDesRades Erst einmal danke für deine Hilfe, aber ich glaube wir reden hier ständig aneinander vorbei ;)

    Wie ich die einzelnen Controls darstellen kann das kenne ich schon, auch dank deiner 4 Videos.

    Mir geht es hier auch nicht direkt um die Technik der Visualisierung, da fummle ich mich schon durch.

    Ich habe ein Problem bei der Datenanbindung in Bezug auf die n:m Beziehung zwischen Episoden und Files, für alles was nach m(Files) kommt.

    Wie oben beschrieben, möchte ich die Inhalte der einzelnen Tabellen als DGV und im Detail mit Textfeldern etc. darstellen. Dabei sollen die DGVs zum Navigieren dienen.
    d.h. wenn ich im ersten DGV eine Zeile auswähle, sollen im 2. DGV nur die referenzierenden Daten angezeigt werden usw.
    Das funktioniert auch schon super bis zu der oben genannten n:m Beziehung (DGV-File2db) und hier komme ich nicht weiter...

    Hofi1609 schrieb:

    aber ich glaube wir reden hier ständig aneinander vorbei
    Ja, scheint mir auch so.

    Zum beispiel diese meine Frage:

    ErfinderDesRades schrieb:

    Hofi1609 schrieb:

    Wie bekomme ich die ab FileData verknüpften Tabellen (Cuts, EIT,...) vernünftig visualisiert?
    Definiere "vernünftig visualisieren".
    Hast du da schon drauf geantwortet - oder ist mir das entgangen?