Anzahl und Auswahl der Binding Source

  • VB.NET

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

    Anzahl und Auswahl der Binding Source

    Hallo zusammen,

    nach dem der Erfinder DesRads hier überall regelmäßig zur Erstellung der Anwendung nur mit Dataset geraten hat, da DB Anfangs zu heftig usw, und ich diesen Vorschlag durchaus nachvollziehen kann, vorallem auch weil das speichern in die XML wunderbar einfach funktioniert, stellen sich nach erfolgreichem durcharbeiten der ersten Turorials die ersten Fragen ein:

    Vorallem frage ich mich, warum beim DGV "Joining View" - also beim parametrieren der Combobox - immer bei der Datasource nicht die vorhandenen Binding Source ausgewählt, sondern bei vorhandenen Datenquellen über die Tabelle eine neue Binding Source angelegt wird, die dann mit aufsteigender Endung im Form unten abgelegt wird.


    Des weiteren habe ich bei meinem Datenmodell folgende Aufgabe:

    Ich habe Räume denen Leistungen zugeordnet werden, beides wird der übergeordneten Tabelle Projekte zugeordnet. Die Leistungen müssen jedoch regelmässig gepflegt werden. Somit sollte egtl. zum Zeitpunkt der Erstellung eines "Projekts" ein Abbild/Kopie der Leistung in der Tabelle Leistungen erstellt werden.
    Nur dann ist gewährleistet, dass sich Preisänderungen der Leistungen nicht in allen bestehenden Projekten auswirken. Über eine vorhandene Leistungsartikelnummer könnte ich eine Funktion Preise aktualisieren verwenden, dann wäre es doch noch möglich die Leistungen in einem Projekt "auf den Stand" zu bringen.

    Mache ich für die Leistungen nur eine separate Tabelle? Oder sogar ein separates Dataset? Und wie bekomme ich die Leistung kopiert?

    Vielleicht ist das für meinen jetzigen Kenntnisstand zu hoch für mich. Keine Ahnung. :/

    Edit: Bevor einer Meckert: Ich weiss IDs haben in der DGV nichts verloren und das da FK steht ist auch nur für den Lern/Gedächtniseffekt ;)
    Bilder
    • binding source.PNG

      93,92 kB, 1.294×501, 145 mal angesehen
    Gruß Hannes

    hans im glück schrieb:

    Vorallem frage ich mich, warum beim DGV "Joining View" - also beim parametrieren der Combobox - immer bei der Datasource nicht die vorhandenen Binding Source ausgewählt, sondern bei vorhandenen Datenquellen über die Tabelle eine neue Binding Source angelegt wird, die dann mit aufsteigender Endung im Form unten abgelegt wird.
    Es gibt eine bestimmte Gestaltungs-Möglichkeit beim DataBinding, die bei JoinigViews meist zu überraschenden Verhalten führt:
    Wenn 2 Controls an derselben BS hängen, dann sind sie synchron.
    Das ist aber beim JoiningView nicht erwünscht, dass die CategoryDatagridviewComboColumn synchron ist etwa mit dem CategoryGrid. Wenn du die synchronisierst, und stellst mitte Combo für einen Artikel eine Category ein - dann hopft dann nämlich auch im Category-Grid die SelectedRow - was ja eiglich mit dem Vorgang nix zu tun hat.

    Ja, so Preisänderungen sind kompliziert. Da muss man zB evtl. eine History modellieren, also dass einem Preis ein Zeitraum zugeordnet ist, in dem er gilt. Und die Verarbeitung von sowas ist auch recht kompliziert, etwa Angebote beziehen sich immer auf den aktuellen Preis, während beim abgeschlossenen Vertrag natürlich der Preis des VertragsDatums gültig ist - und so Sachen.
    Auf jeden Fall ists immer einfacher, alles in ein Dataset zu stopfen. Die Dinge der realen Wirklichkeit stehen in Beziehung zueinander, und die Beziehungen kann man innerhalb des Datasets optimal modellieren - Dataset-übergreifende Beziehungen sind immer ein Krampf.
    Danke für die Antwort.

    Zum Verständnis / Fazit: für jedes control eine separate binding source...

    Was mich jedoch stutzig macht: wenn ich in einem projekt mehrere datasets habe, und sich im machhinein heraus stellt, dass Informationen aus einem andreren dataset hilfreich wären, komme ich da nur mit viel aufwand dran?

    Och frage daher da ich sonst ein recht großes datenmodell aufziehen müsste das dann natürlich schnell unübersichtlich wird.


    Außerdem frage ich Michh, wie es möglich ist einzelne Projekte zu sichern. Einprojekt wäre nach dem oben beschriebenen Modell ja eine ansammlung einzelner datensätze aus verschiedenen datatables. Stehe ich auf dem Schlauch? Derzeit kannn ich ja immer nur das Gesamte dataset in xml sichern.


    (es istmit Diesem blöden tourch teill hier schwoerig annähernd richtige sätze zu produzieren)
    Gruß Hannes

    hans im glück schrieb:

    Fazit: für jedes control eine separate binding source...
    nicht unbedingt. Bei nem DetailView ist die Synchronizität ja erwünscht, da hängen gerne mal 10 Controls anne selben BS.

    Ja, und große Datenmodelle werden recht unübersichtlich, da habe ich noch kein Mittel gefunden: Ist die Realität komplex, so ist auch das Datenmodell komplex.

    Aber wie gesagt: Man kommt üblicherweise nicht auf den Gedanken, 2 wirklich getrennte Bereiche in einer Anwendung zu bearbeiten - oder planst du ein Programm für ein Warenhaus, mit dem man auch Testreihen zum Schwingungsverhalten von Autoblechen auswerten kann?

    Und weiters wichtig: Fang unbedingt mit was einfachem an.

    Und nein: bei DatasetOnly lädtst und speicherst du immer den ganzen Datenbestand. Auszüge daraus zu verarbeiten stellt eine Optimierung im Hinblick auf Arbeitsspeicher dar, und Optimierungen sollte man immer erst zuallerletzt anfassen - gugge Rules Of Optimization.
    Und das ist ja kein Problem - wenn deine Anwendung in einem oder mehr Jahren soweit fertig ist - hinterlege halt eine DB und ersetze die .Read/WriteXml-Aufrufe durch DataAdapter.
    Edit by ErfinderDesRades: unnötiges Vollzitat entfernt


    ich sortiere für mich zum besseren Verständnis erstmal die Begrifflichkeiten und bitte um korrektur wenn falsch:

    Das Dataset stellt eine Datenbank mit Relationen und definierten Datentypen dar die zur Laufzeit erzeugt wird und ausschliesslich im RAM liegt.
    Das Databinding holt die Daten aus dem dataset und stellt sie controls zur Verfügung?

    Habe ich Situationen in denen die Datarow/Datensatz simultan aktualisiert werden kann, Detail View der Joining View Videos, zb mit Combo Boxen oder TextBoxen, kann ich auf bestehende Datanbindings zurück greifen.

    Stelle ich drei verschiedene Tabellen des Dataset auf einem Form dar, z.b. mittels DGV, dann lege ich pro Control eine Databinding an.

    Wenn ich nun selbst mit einigen Werten Berechnungen anstellen will, hole ich mir die Daten dann mit Linq aus dem Binding oder aus dem Dataset?

    Irgendwo habe ich einen Knoten im Hirn...
    Gruß Hannes

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

    • Das Dataset stellt eine Datenbank mit Relationen und definierten Datentypen dar die zur Laufzeit erzeugt wird und ausschliesslich im RAM liegt.
      leidlich richtig. Dataset ist natürlich keine Datenbank, oder nur im weiteren Sinne. Genau gesprochen: Datenbank und Dataset sind verschiedene Konkretionen desselben abstrakten Datenmodells. Datenbank konkretisiert es im Kontext von Sql, und Dataset konkretisiert das Datenmodell im Kontext von vb.Net. Und nur letzteres ist direkt im Code verwendbar, denn du codest in einer vb.net-Umgebung, nicht in einer Sql-Umgebung.
    • Das Databinding holt die Daten aus dem dataset und stellt sie controls zur Verfügung?
      Databinding ist kein Dingens, was holt und zur Verfügung stellt, sondern ist eine Vorgehensweise oder auch ein Wirk-Prinzip: Sind Bindings gesetzt, so zeigen sich Änderungen im Dataset direkt auch in den angebundenen Controls, und Änderungen an den Controls wirken direkt zurück auf die Daten im Dataset. Eine wechselseitige Beziehung - Binding eben.
    • Habe ich Situationen in denen die Datarow/Datensatz simultan aktualisiert werden kann, Detail View der Joining View Videos, zb mit Combo Boxen oder TextBoxen, kann ich auf bestehende Datanbindings zurück greifen.
      Den Satz kann ich gar nicht verstehen. DataRows simultan aktualiieren??? Also an eine Row können mehrere Controls gebunden sein, und die aktualisieren sich simultan.
    • Stelle ich drei verschiedene Tabellen des Dataset auf einem Form dar, z.b. mittels DGV, dann lege ich pro Control eine Databinding an.
      eine Databinding anlegen? Was ist eine Databinding? Ganze Tabellen bindet man über eine Mittler-Klasse, die BindingSources. Überhaupt bindet man vorzugsweise über BindingSources.
      Eine BindingSource verwaltet meist eine ganze Tabelle, und hat auch eine Current-Verwaltung, also die merkt sich, was der aktuell angewählte Datensatz ist. Wenn du EinzelControls, etwa Textboxen an diese BindingSource bindest, so zeigen die natürlich nicht die ganze Tabelle, sondern nur eine Property des aktuell angewählten Datensatzes
      Hast du hingegen ein DGV an die BS gebunden, so zeigt es alle DataRows, und den aktuell angewählten Datensatz hebt das DGV entsprechend hervor.
    • Wenn ich nun selbst mit einigen Werten Berechnungen anstellen will, hole ich mir die Daten dann mit Linq aus dem Binding oder aus dem Dataset?
      Wieso mit Linq? Ja, Linq geht auch, ist aber nicht die erste Wahl.
      Also letztendlich sind die Daten im Dataset, und kommt drauf an, was du berechnen willst. Willst du alle Datensätze, dies gibt verarbeiten, dann ruf die Daten vonne DataTable ab.
      Meist will man aber nur den aktuell gewählten Datensatz verarbeiten, und den kann man von der BindingSource abrufen.
      Auch kann man in der BindingSource Filter gesetzt haben, etwa alle Bestellungen eines Kunden. Die würde man dann auch vonne BindingSource abrufen - nicht aus der Bestellungen-DataTable, wo ja auch die BEstellungen aller anneren Kunden drinne sind.
    so nachdem ich nun mit den hinweisen mehr chaos etwas sortiert habe bin ich auf ein für euch kleines Problem gestossen.

    nachdem ich im dataset eine boolean spalte hinzu gefügt habe und mein dgv mit der spalte erweitert habe( aktuelles gehalt chechbox im angehängten bild1) dachte ich alles ist soweit klar, jedoch taucht die spalte in der Anwendung beim debuggen nicht auf (2tes bild2).

    wo liegt hier der Hund begraben?

    außerdem habe ich mir zur aufgabe gemacht das Feld aktuelles gehalt anhand der zeitfenster zu berechnen.
    da bei einem Arbeitnehmer ja immer nur ein gehalt aktuell sein kann, müssten alle ehemaligen ja entsprechend dem abgelaufenen Datum quasi inaktiv sein. wie aber kann ich das berechnen und dann den true wert in das Feld schreiben?
    müsste ich hier eine for each schleife anwenden und alle gehalts datensätze durchgehen? wie kann ich auf die felder zugreifen?

    danke vorab.
    Bilder
    • bild1.PNG

      20 kB, 1.019×371, 130 mal angesehen
    • bild2.PNG

      25,07 kB, 1.112×447, 144 mal angesehen
    Gruß Hannes
    dieses Problem konnte ich durch löschen des dgv beheben.
    warum auch immer. nicht nachvollziehbar, beim neuen dgv wurde alle korrekt dargestellt.

    jetzt habe ich ein neues problemchen:

    ich hänge das mal hier an:

    das laden und speichern (read und writexml vom dataset) habe ich nun in ein Hauptform (Mdi Container) umgezogen.
    System.IO ist importiert und Datafile As New Fileinfo bekannt gemacht.

    Das laden und speichern habe ich mit Try Catch in eine Public Sub im Hauptform geschrieben.

    In meinem vorhandenen (jetzt MDI Child) Form habe ich den Laden und Speichern befehl auf MainFrm.DatenLaden() geändert.

    Leider kommen keine Daten aber auch kein Fehler. Kann mit jemand sagen wo hier das Problem liegt?
    Die XML war ja schon vorhanden und gefüllt.
    Gruß Hannes
    auf deinem MDI-Parent hast du ein Dataset - richtig?
    und auf deinem MDI-Child hast du auch ein Dataset, oder?
    Dann ists ganz logisch, dass im anneren Dataset nix ankommt, wenn du das eine befüllst.

    Eine Lösung ist, alle BindingSources zur Laufzeit dergestalt umzustöpseln, dass alle Controls beider Forms nur noch an ein und dasselbe Dataset gebunden sind.

    Fertigpackung dazu gibts hier: Form-übergreifendes Databinding