Grundl.frage; Zwei Forms, eine Datatable

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von lris08.

    Grundl.frage; Zwei Forms, eine Datatable

    Hallo,

    hab mal eine grundlegende Frage: :)

    Habe zwei Form's, in beiden ist ein Datagridview das an eine Datatable (durch Designer erstellt) gebunden ist.

    Wenn ich in Form 2 in dem DGV etwas eingebe wird dies in der Datatable gespeichert.
    Wenn Form 2 geschlossen wird, ist/bleibt das Datagridview in Form 1 leer..

    Wie kann ich ein Datengebundenes DGV aktualisieren?

    Lg lris
    Habe gerade über die Suchfunktion gesucht, keinen Eintrag über so ein Thema gefunden.

    Habs graf mal so versucht... aber kein Erfolg:

    VB.NET-Quellcode

    1. Me.AltDachDataGridView.DataSource = Nothing
    2. Me.AltDachDataGridView.DataSource = Me.AltDachBindingSource


    Wie würdest du neu einlesen?
    Genau da habe ich dann aufgehört.
    Form übergreifend zu arbeiten.
    Ich habe mein ganzes Konzept überdacht und umgestellt.
    ErfinderDesRades hatte da Recht. Alles nur Frickelei. was ich dann auch feststellen musste.

    Also irgendwo einen Button platzieren und "Relaod" einbauen, mit allem was dazu gehört.

    sorry

    Bernd

    lris08 schrieb:

    Habe zwei Form's, in beiden ist ein Datagridview das an eine Datatable (durch Designer erstellt) gebunden ist.

    Wenn ich in Form 2 in dem DGV etwas eingebe wird dies in der Datatable gespeichert.
    Wenn Form 2 geschlossen wird, ist/bleibt das Datagridview in Form 1 leer..

    Wie kann ich ein Datengebundenes DGV aktualisieren?

    Du kannst Form-übergreifendes Databinding verwenden.
    Dazu muß man alle BindingSources aufspüren, die direkt an ein Dataset desselben Typs gebunden sind, und sie umstöpseln auf das einzige Dataset, was man in der App haben will.
    Die BindingSources dagegen, die an anneren BindingSources hängen, dabei in Ruhe lassen.

    in DBExtensions ist das ziemlich vollständig gelöst.

    Kannst die Umstöpselei auch selbst programmieren, das ist aber nicht ganz trivial, und ergäbe eine Lösung, die nur auf deine spezielle App passt (dabei will man sowas eiglich häufiger mal)
    Das, was du da schilderst ist son bisserl des Problem, wen man Datasets mit einer Anwendung mit mehreren Forms verwendet und die DGV mitn Designer auf die Forms zieht.
    Der dem Projekt hizugefügte und mit Tabellen designte Dataset ist lediglich eine Klasse, die alle Properties und Methoden usw. deines Datenmodels enthält. Der Formsdesigner erzeugt nun beim Ziehen eines DGV auf die Form eine neue Instanz (objekt) des Dataset in der Form. Das kannst du dir im Designercode ansehen. Da steht dann sinngemäß: Dim BimBamDataset as New BimBamDataset. Des Dinge wird dann im Code mit Me.BimBamDataset verwendet. Dieser Mechanismus bewirkt, dass jede Form ihr eigenes Objekt des Typs BimBamDataset nutzt. Dadurch werden Aktualisierungen natürlich erschwert.
    Du müsstest also in deinem Code dafür sorgen, dass alle Forms auf die gleiche Dataset-Instanz zugreifen.
    Lösungen z.B.:
    1. könntest du dir in einem Modul deine projektweit verfügbare Instanz erstellen, mußt dann aber in allen Forms die Bindingsources und die DGV´s entsprechend zu Fuß umstöpseln auf diese deine "Projekt"-Instanz. Bei umfangreichen Projekten kann das etwas aufwändig werden, aber bei 2 Forms würde sich der aufwand sicher noch lohnen.
    2. Du nutzt nur 1 Form und arbeitest mit einem TabControl. Da hast du nur 1 Instanz des Dataset und du kannst den Designer wie gewohnt benutzen.
    3. Du schaust dir mal die Links in den Signaturen von Erfinder des Rades an. Der hat ne Helpergeschichte geschrieben, die genau das, was ich dir unter 1. beschrieben habe automatisch vollführt. Da werden die ganzen Databindingssdingens automatisch umgestöpselt und du kannst den designer ebenfalls normal benutzen. (So habichs jedenfalls verstanden, habs mir aber auch noch nicht ernsthaft reingezogen und getestet)

    Fiel Fergnügen

    Vatter

    Edit:
    Da isser schon, der EDR. Ich habs trotzdem nochma versucht zu erkären...
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    ist super erklärt, und Lösung 2 war noch garnet angesprochen, und die findich, wos möglich ist, am günstigsten. :thumbsup:

    Man kann ja beim TabControl die Reiter zur Laufzeit wegmachen, und codeseitig den SelectedTabIndex steuern. Dann poppt kein neues Form auf, sondern das bestehende springt einfach in eine neue Ansicht.

    TabReiter verstecken:

    VB.NET-Quellcode

    1. private Sub Form_Load(...) Handles Me.Load
    2. With Me.TabControl1
    3. .SizeMode = TabSizeMode.Fixed
    4. .ItemSize = New Size(0, 1)
    5. .Appearance = TabAppearance.Buttons
    6. End With
    7. End Sub
    Ok, nmur damit ist das jetzt alles auch richtig verstehe :)

    Habe mir das genau durchgelesen... Sagt mir bitte wenn ich falsch liege, denn des will ich auf jeden Fall verstehen...


    In Form 2 wo ich die Daten eingebe und diese in der vom Designer erstellten Table gespeichert werden komme ich in Form 1 so einfach mal nicht rein, weil -sagen wir mal- die Daten im DataSet des jeweiligen Form gefangen sind - so habe ich das jetzt erstmal verstanden - richtig ?
    korrekt,
    du müßtest also (wenn eine Datenbank dranhängt) in Form 2 die Daten zur Datenbank übertragen(Update) und dann in Form 1 mittels Fill die Daten aus der Datenbank neu in die Anwendung (Form1.Dataset) einlesen.
    Das is bei großen DBs natürlich nicht wirklich lustig. Da is ein projektweites Dataset deutlich überlegen, weil immer aktuell.
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    ok... na wenigstens habe ich das verstanden :)

    ABER ;) jetzt ist mir da eine Funktion eingegallen: Modifers als Friend

    Wenn ich also mein Form 2 aufrufe, wo ich meine Daten in das Datagridview und damit auch zwangsläufig in der Dataset gefangene Datatable speichere, schließe ich dieses Form... die Daten sind ja noch in der Datatable enthalten - weil noch nicht gelöscht und in Form 2 fülle ich das Datagridview nicht über ein DataSet (Designer) sondern mache einfach einen Übergriff mit DataSource auf das DataSet.TableForm2 :)

    VB.NET-Quellcode

    1. Berechnung_Dachkonstruktionen.ShowDialog()
    2. AltDachDataGridView.DataSource = Berechnung_Dachkonstruktionen.ProgrammDatenSet.AltDach


    Ob das allerdings die Lösung aller Dinge ist, bezweifel ich mal... aber immerhin wird in Form1 ja nur angezeigt und nicht bearbeitet (ist hier untersagt).

    Was meint Ihr zu dieser Idee?

    lris

    Vatter schrieb:

    is bei großen DBs natürlich nicht wirklich lustig...
    sone Haltung von doppelten Daten (in 2 Dataset-Instanzen) ist immer Mist, verstößt gegen das allgemeine Redundanz-Verbot.
    Jede Redundanz verursacht einen Rattenschwanz an Folgeproblemen, und ist in jeder Form von Übel.
    Ob du nun denselben Code an 2 Stellen hinschreibst, oder dieselben Daten in 2 Datasets lädst - dasselbe Thema auf zwei verschiedenen Gebieten.
    Sogar inne richtigen Welt gilt das Redundanz-Verbot an vielen Stellen - zB. ist für jeden nur ein Personalausweis vorgesehen.

    Man kann den Fortschritt der Entwicklung der Computersprachen (von Variablen zu Schleifen, Methoden, Klassen bis hin zu Generica) auch auffassen als einen Fortschritt in der Entwicklung der Redundanz-Vermeidung.

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

    Nadürlich kannst du genauso, wie auf ein zentrales Dataset in einem Modul auch auf das Dataset der anderen Form verstöpseln. Mußt halt nur die Übersichtlichkeit im Auge behalten tun ;)
    Ich (persönliche Ansicht nach einem Thread von Bernd und EDR) habe daher wie Bernd auf ein Design mit vielen Forms verzichtet und lieber Tabcontrol genommen. Für die Übersichtlichkeit im Code habich dann die Funktionen/Subs des jeweiligen Tabpage in eine Region gepackt. Dann gehts auch wieder mit der Übersicht (wobei dafür Partial Class auch schön ist)
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Ok..

    also erstmal wirklich danke... des is ja schon ein recht umfangreiches Thema... es hat mich auf jeden Fall ein Stück weiter gebracht.
    Ich werde mich die Tage mal damit beschäftigen ein Programmweites DataSet zu erstellen... mal sehen ob es mir gelingt :) vielleicht komme ich da nochmal auf euch zu :)



    Zum Abschluß nur noch eine Frage an euch, aber bzgl. der Formatierung des DGV das nun an meine zweite Datatable gehängt habe.
    Das Datagridview das am DataSet (Designer) hängt kann man auch schön mit dem Designer formatieren, was für Spalten angezeigt werden sollen usw usw...
    Die löse ich das am besten wenn ich ein DataGridView nur über

    VB.NET-Quellcode

    1. AltDachDataGridView.DataSource = Berechnung_Dachkonstruktionen.ProgrammDatenSet.AltDach

    fülle ??

    Gibts da eine Möglichkeit, oder ist das z.B. jetzt ein Problem das "EDR" meinte... da kommen die Folgeprobleme auf einen zu ?

    Lg
    naja, dieses Umstöpseln muß zur Laufzeit geschehen - im Designer muß (leider) mit den redundanten Datasets gearbeitet werden.
    Grad durchs Umstöpseln wird ja die Redundanz vermieden (und das annere Dataset kann weg).

    Aber ich würde immer über eine BindingSource binden - nicht direkt an eine DataTable.
    Weil an der DataTable hängen womöglich noch annere DGVs, und wennde nun im einen DGV umsortierst hat das glaub auswirkungen auf die anneren Views.
    Außerdem stellt die BS noch Sortieren, Filtern, und Zugriff aufs aktuelle Item bereit, was die DataTable selbst nicht so bringt.