Probleme mit Form-übergreifenden DataBinding!

  • VB.NET

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

    Probleme mit Form-übergreifenden DataBinding!

    Hallo,

    ich habe ein Problem beim Realisieren des Form-übergreifenden Databindings bei meinem typisierten Dataset. Leider musste ich feststellen, dass meine Herangehensweise beim erstellen des Datasets wohl nicht ganz richtig war. Kurz gesagt ist die Situation so, dass ich als erstes eine ChildForm erstellt habe, dort einiges an Daten darstelle und bearbeite. Beim Laden der ChildForm wird das DataSet geladen:

    VB.NET-Quellcode

    1. Public Sub Dataset_LoadXml()
    2. DsMeasurement.Clear()
    3. For Each dt As DataTable In DsMeasurement.Tables
    4. dt.BeginLoadData() ' Setzt DataBindings aus, damit Bindings erst vollzogen werden, wenn alle Daten bereitstehen
    5. Next
    6. If _Datafile.Exists() Then DsMeasurement.ReadXml(_Datafile.FullName)
    7. For Each dt As DataTable In DsMeasurement.Tables
    8. dt.EndLoadData()
    9. Next
    10. DsMeasurement.EnforceConstraints = True
    11. DsMeasurement.AcceptChanges()
    12. End Sub


    Und bei jeder Änderung an einem Datensatz in der ChildForm wird das DataSet gespeichert:

    VB.NET-Quellcode

    1. Private Sub SaveDataSet()
    2. Validate() ' Überprüft alle aktuellen Control-Eingaben und übernimmt sie in die Datasource. Ist wichtig, da sonst evtl. letzte Eingabe gecancelt wird.
    3. DsMeasurement.WriteXml(_Datafile.FullName)
    4. DsMeasurement.AcceptChanges() ' Markiert alle Datensätze als übereinstimmend mit der "Datenbank" - wichtig für den DataSet.HasChanges-Test im FormClosing.
    5. End Sub


    Die ParentForm war bis dato außenvor und nun möchte ich die Daten eben hier darstellen. Mein Programmstart gestalte ich wie folgt:

    VB.NET-Quellcode

    1. <STAThread>
    2. Public Sub Main()
    3. Application.EnableVisualStyles()
    4. Application.SetCompatibleTextRenderingDefault(True)
    5. My.Settings.Save()
    6. Dim frmMain As New frmMain
    7. frmMain.TemperaturKurvenBindingSource.DataSource = frmTempCurves.DsMeasurement
    8. frmMain.TemperaturKurvenSegmenteBindingSource.DataSource = frmTempCurves.DsMeasurement
    9. Application.Run(frmMain) ' Konstruktor für Form wird aufgerufen
    10. End Sub


    Dort habe ich jetzt versucht mal beispielhaft zwei BindingSources von der ChildForm auf mein Parent „umzustöpseln“, gemäß des „CrossBindings“ aus folgendem Thread:

    Daten laden, speichern, verarbeiten - einfachste Variante

    Ich weiss, im Vergleich dazu versuche ich es gerade genau umgekehrt. Zwar kriege ich so die Daten dargestellt, meine ParentForm kriegt aber keine Änderungen in der ChildForm mit! Wie wäre das theoretisch umzusetzen, dass meine ParentForm Datenänderungen mitschneidet?

    Wichtigere Frage für mich: Wenn ich in der ChildForm Änderungen an Daten vornehme, greife ich dann immer auf das DataSet der ParentForm zu?Z.B.:

    VB.NET-Quellcode

    1. frmMain.DsMeasurementMain.TemperaturKurvenSegmente.AddTemperaturKurvenSegmenteRow(newSegRow)


    Oder läuft alles über das DataSet der ChildForm? Wann speichert man die DataFile des DataSets dann am besten?

    Peterle
    Habe es scheinbar hinbekommen, indem ich beim Laden der ChildForm dieser zunächst das DataSet der ParentForm und anschließend den BindingSources der ChildForm direkt die Tabellen aus dem DataSet der ParentForm zugewiesen habe... Auszug:

    VB.NET-Quellcode

    1. If frmTempCurves Is Nothing OrElse frmTempCurves.IsDisposed Then frmTempCurves = New frmTempCurves
    2. With frmTempCurves
    3. .DsMeasurement = Me.DsMeasurementMain
    4. .bsHeizrate.DataSource = Me.DsMeasurementMain.Heizrate
    5. .bsMessIntervall.DataSource = Me.DsMeasurementMain.MessIntervall
    6. .bsOfenAktion.DataSource = Me.DsMeasurementMain.OfenAktion
    7. End With
    8. If Not frmTempCurves.Visible Then frmTempCurves.Show(Me)


    Speichern des DataSets im FormClosing-Event der ParentForm und in der ChildForm keinerlei direkten Zugriffe auf das DataSet der ParentForm...
    Hi,

    Du könntest Dir auch in der Code Datei deines DataSet einen Public Shared Variable machen:

    VB.NET-Quellcode

    1. Public Shared Dts As DeinDataSetName
    2. Private Sub DeinDataSetName_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized
    3. If Dts Is Nothing Then Dts = Me
    4. End Sub


    Du musst dann deine DataSet Code Datei in jeder Form importieren

    VB.NET-Quellcode

    1. Imports DeinProjektName.DeinDatasetName


    Somit hast Du dann überall Zugriff auf Dts...
    "Hier könnte Ihre Werbung stehen..."
    Irgendwie habe ich doch noch große Probleme... mit folgendem Code versuche ich in der ChildForm eine Zeile einer Tabelle des DataSets zu entfernen:

    VB.NET-Quellcode

    1. Private Sub RemoveSegment()
    2. If bsTemperaturKurvenSegmente.Current Is Nothing Then Exit Sub
    3. Dim curRow = DirectCast(DirectCast(bsTemperaturKurvenSegmente.Current, DataRowView).Row, TemperaturKurvenSegmenteRow)
    4. DsMeasurement.TemperaturKurvenSegmente.RemoveTemperaturKurvenSegmenteRow(curRow)
    5. End Sub


    Ich wähle halt die Zeile im DGV aus und drücke auf löschen... hatte bislang geklappt. Er löscht zwar immernoch, jedoch nicht mehr die ausgewählte Zeile des ChildForm-DGVs...Mir ist offensichtlich nicht klar, wie ich die Daten eines übergebenen typisierten DataSets in einer ChildForm korrekt manipulieren kann.
    Nun, einfacher wäre mal bsTemperaturKurvenSegmente.RemoveCurrent. Aber ich stell mir gerade die Frage, wie die bsTemperaturKurvenSegmente an ihre Daten kommt. Steht zumindest nix davon in Post#2.
    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.

    Peterle schrieb:

    Er löscht zwar immernoch, jedoch nicht mehr die ausgewählte Zeile des ChildForm-DGVs
    Sondern? Oder geht es darum, dass Du im Form#1 löschst und in Form#X davon nix zu sehen ist. Oder was anderes?
    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.
    Naja ich habe mir per Datenquellen ein ParentChild-View (youtube.com/watch?v=YP_-eL6DdsA) auf die ChildForm gezogen. Wenn ich in diesem DGV auf der ChildForm nun eine Zeile lösche (s. Post#6), verschwindet meistens irgendein Eintrag, nicht jedoch der im DGV selektierte. Mich würde sehr interessieren, wie man es in dem CrossBinding-Minimalbeispiel (Link in Post#1) realisieren würde, per ChildForm eine Tabellenzeile aus dem der Form übergebenden DataSource zu löschen...
    Ich komm nicht mit. Teste mal den Anhang bitte.
    Dateien
    • TestProject.zip

      (48,95 kB, 33 mal heruntergeladen, zuletzt: )
    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.
    Also ich habe dein TestProject jetzt mal auf meine Situation zugeschnitten (Tabelle Messreihen mit Relation zur Tabelle Temperatures). In der ChildForm stelle ich dann im rechten DGV die ParentChild-Beziehung dar. Dabei erstellt der Designer eine neue BindingSoruce (BsTemperaturesCP habe ich sie genannt). Mein Fehler war es, dass ich beim Löschen einer Zeile per ParentChild-View-DGV nicht auf eben diese neu erstellte BindingSource BsTemperaturePC, sondern auf die BsTemperatures verwiesen habe.

    VB.NET-Quellcode

    1. Public Class FrmChild
    2. Private Sub BtnDelete_Click(sender As Object, e As EventArgs) Handles BtnDelete.Click
    3. ' BsTemperatures.RemoveCurrent() war der Fehler!
    4. BsTemperaturesCP.RemoveCurrent()
    5. End Sub
    6. End Class​


    BsTemperatures zeigt scheinbar immer auf den ersten Datensatz oder so, keine Ahnung was da los ist. Jedenfalls ist es egal welchen Datensatz man im ParentChild-View auswählt, gelöscht wird immer der erste/älteste/was auch immer Datensatz. Ich hatte mir bereits fest vorgenommen morgen alles über den Haufen zu werfen, alles auf die MainForm zu beschränken und weitere Forms per TabControl zu substituieren... Von daher 1000 Dank für dein Beispiel!
    Dateien
    • TestProject.zip

      (135 kB, 32 mal heruntergeladen, zuletzt: )
    Ja gut. Wenn Du kein DGV an die BsTemperatures bindest, dann bleibt die BS-Position natürlich bei Null. Wenn man dann RemoveCurrent aufruft, wird immer der erste Eintrag der BsTemperatures-List gelöscht (also effektiv die erste Zeile der Temperatures-DataTable), unabhängig davon, was in den DGVs gewählt ist. Die ändern ja nur die Position der BindingSources, an die sie gebunden sind.
    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.