gleiches Dataset in mehreren Formen verwenden

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von DerSmurf.

    gleiches Dataset in mehreren Formen verwenden

    EDIT WICHTIG!
    Sorry Leute, keine Ahnung, warum ich hierfür jetzt einen neuen Thread eröffnet habe.
    Es handelt sich bei meinem Problem um ein Programm, mit dem mir von @VaporiZed in folgendem Thread geholfen wird:
    Bitte um Bewertung meines zweiten Projektes - Tea Timer

    Huhu
    Ich habe ein Dataset namens DataSet1, mit drei Tabellen (Abkuehlzeiten, DTTeesorten, und Gefaess).
    In Abkuehlzeiten gibt es eine Spalte GefaessID, welche mit der ID der Tabelle Gefaess verknüpft ist.

    Dieses DataSet möchte ich in einem Projekt, in insgesamt drei Formen verwenden, jedoch schaffe ich dies nur mit zwei Formen, in der dritten bekomme ich das Ding einfach nicht eingebunden :(
    Hier die Aufrufcodes:
    Hauptform:

    VB.NET-Quellcode

    1. Imports Tea_Timer_Professional.DataSet1
    2. Public Class frmHauptform
    3. Dim ZiehzeitMinuten As Integer = 0
    4. Dim ZiehzeitSekunden As Integer = 0
    5. Private _DataFile As New FileInfo("Tee.Xml")


    Aufruf der erste Form (frmEinstellungen) aus der Hauptform heraus - hier klappt alles:

    VB.NET-Quellcode

    1. Private Sub EinstellungenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles EinstellungenToolStripMenuItem.Click
    2. Dim frmEinstellungen As New frmEinstellungen
    3. frmEinstellungen.GefaessBindingSource.DataSource = Me.DataSet1
    4. frmEinstellungen.Show(Me)
    5. End Sub

    und in der Form frmEinsellungen habe ich dann auch noch:

    VB.NET-Quellcode

    1. Imports Tea_Timer_Professional.DataSet1


    Soweit läuft alles wunderbar.
    Nun möchte ich aber in der frmEinstellungen eine weitere Form aufrufen und mithilfe dieser dann neue Einträge hinzuzufügen (die Helpers vom EdR (EditNew), fallen an dieser Stelle glaube ich raus).
    Hierfür verwende ich dann folgenden Aufrufcode:

    VB.NET-Quellcode

    1. Private Sub Btngefaessneu_Click(sender As Object, e As EventArgs) Handles btngefaessneu.Click
    2. Dim frmnGefaess As New frmneuesGefaess
    3. frmnGefaess.GefaessBindingSource.DataSource = Me.DataSet1
    4. frmnGefaess.Show(Me)
    5. End Sub

    und in der Form frmGefaess dann auch den Import:

    VB.NET-Quellcode

    1. Imports Tea_Timer_Professional.DataSet1


    Hier wollte ich dann mit folgendem Code Einträge zur Tabelle Gefaess inzufügen:

    VB.NET-Quellcode

    1. Private Sub Btnspeichern_Click(sender As Object, e As EventArgs) Handles btnspeichern.Click
    2. Dim neuesgefaess As DataSet1.GefaessRow
    3. neuesgefaess = DataSet1.Gefaess.NewGefaessRow()
    4. neuesgefaess.Name = txtName.text
    5. DataSet1.Gefaess.Rows.Add(neuesgefaess)
    6. End Sub

    und dann entsprechend dieses Wertes verknüpfte Werte in die Tabelle Akuehlzeiten schreiben.
    Hierzu frage 1. Wie komme ich an die entsprechende Verknüpfung zwischen Gefaesstabelle und Abkuehlzeiten Tabelle, um für mein neu erstelltes Gefaess Abkühlzeiten zu hinterlegen?

    Da jedoch nach Ausführung dieses Codes einfach garnichts passiert, habe ich einfach aus den Datenquellen das Datagridview zu meiner Gefaesstabelle auf die Form gezogen.
    Doch das bleibt leer. Also muss ich ja irgendwo in der Weitergabe meiner BindingSource einen Fehler gemacht haben.
    Diesen finde ich aber nicht :(

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

    DataSet1.Gefaess.Rows.Add(neuesgefaess): Das beeinflusst das formeigene tDS, nicht das Original-tDS aus dem Hauptform. Du gibst ja nur das tDS an die BindingSources weiter, ersetzt aber die lokale/formeigene tDS-Instanz nicht. Einfach mal probieren mit frmGefaess.DataSet1 = Me.DataSet1 im Subform-Erstellungs- und -aufrufcode
    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.
    Und nun schreibe ich mit dem Helfer meiner Träume über das gleiche Programm in zwei Threads.
    Echt, sorry dafür...

    VB.NET-Quellcode

    1. Private Sub Btngefaessneu_Click(sender As Object, e As EventArgs) Handles btngefaessneu.Click
    2. Dim frmnGefaess As New frmneuesGefaess
    3. 'frmnGefaess.GefaessBindingSource.DataSource = Me.DataSet1
    4. frmnGefaess.DataSet1 = Me.DataSet1
    5. frmnGefaess.Show(Me)
    6. End Sub

    bringt leider keinen Unterschied.
    Die hinzufügen Sub macht nüscht, und auch mein Datagridview bleibt einfach leer.

    Ich verstehe nur nicht, warum die weitergabe des DataSets an die frmEinstellungen tadellos funktioniert.
    Aber die Weitergabe an frmneuesGefaess zickt rum - die Codeseitige Weitergabe ist doch die gleiche.
    Aber auch im Designer kann ich ja eigentlich nix falsch machen.
    Ich probiere es mal, wenn ich daheim bin und meld mich dann. Es sollte ja mit dem Upload aus dem anderen Thread nachvollziehbar sein. Mal sehen, ob ich was finde.
    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.

    VB.NET-Quellcode

    1. Private Sub Btngefaessneu_Click(sender As Object, e As EventArgs) Handles btngefaessneu.Click
    2. Dim frmnGefaess As New frmneuesGefaess
    3. frmnGefaess.GefaessBindingSource.DataSource = frmHauptform.DataSet1 '<-----
    4. 'frmnGefaess.DataSet1 = Me.DataSet1
    5. frmnGefaess.Show(Me)
    6. End Sub


    Probier einmal das.
    Ich mach's grundsätzlich so auf diese Art. Die Namen habe ich versucht zu erraten.

    Hauptform:

    VB.NET-Quellcode

    1. Private Sub Btngefaessneu_Click(ByVal sender As Object, ByVal e As EventArgs)
    2. Using frm As frmneuesGefaess = New frmneuesGefaess(DataSet1)
    3. frm.ShowDialog(Me)
    4. End Using
    5. End Sub


    frmneuesGefaess:

    VB.NET-Quellcode

    1. Namespace Formen
    2. Public Partial Class frmneuesGefaess
    3. Inherits Form
    4. Public Sub New(ByVal dataSet As DataSet1.GefaessRow)
    5. InitializeComponent()
    6. DataSet1 = dataSet
    7. GefaessBindingSource.DataMember = "Siehe_in_der_aufrufenden_Form_in_der_BindingsSource_nach"
    8. GefaessBindingSource.DataSource = DataSet1
    9. End Sub
    10. End Class
    11. End Namespace


    Das heißt, dass auf beiden Formen die identischen Winform Objekte für das DataSet und der benötigten Bindingssource vorhanden sind.
    Durch den Aufruf der Form mit dem Dataset wird statt einer neuen Instanz, die verwendete Instanz des Hauptform an das Tocherfenster übergeben.
    Nun müssen die Bindingssourcen noch von Hand "neu" mit den sowieso schon eingetragenen Werten überschrieben werden. Macht man das nicht, kleben die noch an der nicht mehr vorhandenen neuen Instanz, statt die übergebene Instanz zu verwenden. Dummerweise hat man sonst keine Daten in dem Tochterfenster.
    Den Trick hab ich mal aus älteren Threads vom @ErfinderDesRades geklaut.
    @Dksksm: öhm ...: Public Sub New(ByVal dataSet As DataSet1.GefaessRow)?
    @DerSmurf: Hast Du auch zuvor aus dem Hauptform die tDS-Instanz an das 1. Subform weitergegeben? Denn sonst gibst Du ja eine leere tDS-Instanz vom 1. ans 2. Subform weiter.
    Und bedenke bitte: Imports Tea_Timer_Professional.DataSet1 ist nur ein importierter Namespace und hat somit nur einen Einfluss auf das, was Du schreiben muss. Es verkürzt nur, dass Du z.B. nicht schreiben musst: Dim NewRow As Tea_Timer_Professional.DataSet1.GefaessRow, sondern dann verkürzt nur Dim NewRow As GefaessRow. An den Zugriffen selbst oder die Verwendung ändert sich sonst nichts. Man kann also auch darauf verzichten, hat dann aber etwas mehr Schreibarbeit. Aber sonst macht das Imports nix! Ich habe nämlich das Gefühl, dass Du der Zeile mehr Bedeutung zuschiebst als sie hat.
    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 2 mal editiert, zuletzt von „VaporiZed“ ()

    Ja schon, aber Du kannst doch einer tDS-Variablen keine DataRow-Instanz als Wert übergeben. Da müsste doch sowas kommen wie: Option Strict On erlaubt keine Konvertierung von DataRow in DataSet oder sowas.
    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.
    Wie gesagt ich habe die Namen zusammengebastelt, da kann mir schon ein Fehler unterlaufen sein. Kopier mal Code aus dem Projekt, baller das bei Telerik rein, kopiere das in Notepad++, schmeiss alles raus was dein Krams ist und ersetze die Namen auch noch anhand dessen, was die Informationen hergeben. Kann sein, dass ich was wesentliches verbockt habe dabei.
    Ja nee, ich sehe es aber auch jetzt erst wirklich, das kommt vom zusammenkopieren.
    Natürlich übergeb ich das Dataset selbst.
    In Form-übergreifendes Databinding stelle ich die grundsätzliche Lösung des Problems dar.
    In DetailDialog, DatasetHelpers und viele Beispiele liegt glaub eine Version meiner Helpers bei (vb10Projects.zip), die eine Dataset.Register-Extension beinhaltet, mit der man das Problem im Einzeiler abhandeln kann.
    Oder du stellst nochmal dein Projekt ein mit 2 Formen, und ich bastel meine aktuellste Helpers-Version dran.
    Weil ich hab immer mal wieder bischen dran rum-verfeinert.

    Ach guck - in deine Tee-Solution haste ja bereits eine taugliche Helpers-Version drinne.
    Also das Registrieren des lokalen Datasets geht einfach so - in jedem Form, was damit arbeiten soll:

    VB.NET-Quellcode

    1. Public Sub New()
    2. InitializeComponent()
    3. DataSet1.Register(Me, True)
    4. End Sub
    Der 2. Parameter (True) heisst "HandleFormClosing".
    Wenn true gesetzt kümmert sich die Registrierung selbständig darum, dass das Dataset beim Schliessen des Forms gespeichert wird.
    Also wenn Änderungen vorliegen kommt eine Abfrage, ob gespeichert werden soll, und wenn ja, ja.

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

    Huhu
    Danke EdR, ich glaube es gibt so einiges aus deinen Tuts, was ich überlesen habe :(
    Wenn du eine verfeinerte HelpersDatei hast, bin ich aber sehr daran interessiert!

    Die andere Weitergabe (also ohne Helpers) sieht wie folgt aus:

    VB.NET-Quellcode

    1. Dim frmnGefaess As New frmneuesGefaess
    2. frmnGefaess.DataSet1 = Me.DataSet1
    3. frmnGefaess.GefaessBindingSource.DataSource = Me.DataSet1
    4. frmnGefaess.Show(Me)


    Das DataSet muss natürlich auch weitergegeben werden.
    Danke an Vaporized und hier wieder der Link auf den anderen Post zum gleichen Problem:
    Bitte um Bewertung meines zweiten Projektes - Tea Timer