DataGridView springt bei Datenänderung per Code

  • VB.NET
  • .NET 5–6

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

    DataGridView springt bei Datenänderung per Code

    Guten Abend,

    ich habe ein kurioses Problem mit zwei Datagridviews.

    Es handelt sich um Zwei Datagridviews mit einer Parent-Child ansicht. Also im ersten sind vereinfacht gesagt Autoren genannt und im zweiten sieht man dann alle Bücher eines Autors. In beiden Datagridviews können im View Daten bearbeitet werden, falls das wichtig ist.

    Jetzt passiert folgendes:
    Ich wähle im übergeordneten Datagridview einen Eintrag aus in dem ich ihn anklicke. Daraufhin aktualisiert sich das zweite Datagridview und zeigt alle Child Einträge zu dem Haupteintrag an.
    Ich kann die Daten manuell ändern und auch das funktioniert einwandfrei. Wenn ich jetzt allerdings im Childview ein Feld per Code ansprechen möchte fängt er an zu spinnen:

    Ich möchte mit einem Button.Click Ereignis etwas in die derzeit gewählte Zeile im "Child" schreiben. Das mache ich folgendermaßen:

    VB.NET-Quellcode

    1. Private Sub SchreibeWertInAktuelleZeile(sender As Object, e as EventArgs) Handles Button.Click
    2. Dim row = DirectCast(DirectCast(ChildTableBindingSource.Current, DataRowView).Row, DataSet.ChildTableRow)
    3. row.Ergebnis = 77 'row.Ergebnis ist eine Spalte vom Typ Double
    4. End Sub


    Nachdem der Code ausgeführt wurde, springt auf einmal die Parent-Datagridview (bzw. Parent-Bindingsource) in eine völlig andere Zeile und es werden die zu der anderen zeile gehörenden Child-Einträge angezeigt. Es ist nicht der nächste Eintrag o.ä. sondern es werden mehrere Einträge übersprungen.


    Mache ich einen Fehler beim Schreiben des Wertes, oder woran kann es liegen? Wenn ich im Einzelschritt debugge, dann findet der Sprung nach dem "End Sub" statt. Da erschließt sich mir leider überhaupt nicht wo ich danach suchen soll?!

    Gibt es übliche Verdächtige die man da prüfen kann/soll?

    Ich danke euch schonmal

    Grüße
    Philipp
    1. Ist ChildTableBindingSource die richtige oder gibt es noch eine zweite, die nur auf die Bücher des gewählten Autors verweist? ChildTableBindingSource könnte ja auch die Bücher aller Autoren enthalten.
    2. Hast Du uns ein Testprojekt?
    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.
    Ich gehe davon aus, dass es die richtige ist. Das Databinding funktioniert ja soweit auch zufriedenstellend. (Es werden ja grundsätzlich immer die richtigen Child-Daten angezeigt.) Die Parent-Table springt nur unvorhersehbar.

    Habe leider grade kein Test-Projekt welches "einfach so" zu durchschauen wäre. Könnte mich dran setzen und eines schreiben. Dabei würde dann vielleicht auch auffallen ob das dort dann gar nicht auftritt o.ä...


    Mir ist grade noch aufgefallen, dass die Parent-View nicht immer zu einem anderen Eintrag springt. ABER: Wenn ich einen Eintrag mittig wähle, dann scrollt das DGV so, dass der gewählte Eintrag der letzte sichtbare im DGV ist. Finde ich auch merkwürdig, das möchte ich ja ebenfalls nicht...
    Dass das DataBinding funktioniert, bezweifle ich ja auch gar nicht. Ich habe gefragt, ob es noch eine BindingSource gibt. Will heißen: Schau auch mal im Designer nach, welche BindingSources es gibt und ob das Child-DGV an die ChildTableBindingSource gebunden ist oder an eine andere. Aber bzgl. Testprojekt: Kannst ja auch nur die FormX.Designer.vb hochladen, würde mir vielleicht schon reichen.
    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.
    okay, also es gibt auf der Form noch weitere BindingSources, das ist richtig.
    Das Child-DGV ist an die Child-Bindingsource gebunden.

    Ich weiß noch nicht genau warum, aber wenn ich folgende Zeile ergänze funktioniert es ohne komisches hin und herspringen...

    VB.NET-Quellcode

    1. Private Sub SchreibeWertInAktuelleZeile(sender As Object, e as EventArgs) Handles Button.Click
    2. Dim row = DirectCast(DirectCast(ChildTableBindingSource.Current, DataRowView).Row, DataSet.ChildTableRow)
    3. row.Ergebnis = 77 'row.Ergebnis ist eine Spalte vom Typ Double
    4. FrmStart.Dataset.AcceptChanges()
    5. End Sub

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

    Belass es bitte nicht einfach bei dem AcceptChanges, Stichwort Root Caus Analysis
    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.
    Zu gerne ändere ich die Ursache und nicht bloß das Symptom... Ich hoffe, dass es vielleicht beim Eingrenzen hilft.

    Es werden auch andere Events ausgewertet, wie EDR vermutet. Ich habe den Inhalt dieser Auswertungen mal komplett auskommentiert und habe dennoch das springende Verhalten...

    Zusätzlich habe ich das ganze mal vereinfacht nachgebaut und kann dort das Verhalten nicht nachstellen...

    Grob tippe ich auch in Richtung Events, kann ich denn dem Debugger nicht sagen ich möchte wirklich alles sehen was noch passiert? Wie gesagt, nach dem EndSub schmeißt er mich leider raus und ich kann nicht nachvollziehen was er sich dabei so denken könnte... :(
    Beim End Sub kannst Du einen Haltepunkt setzen. Wenn das Programm da stoppt, dann F11 für Einzelschritt und Du siehst, was als nächstes von Deinem Code abgearbeitet wird.
    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.
    Okay langsam bekomme ich das Problem eingegrenzt.
    Der "Workaround" mit FrmStart.Dataset.AcceptChanges()FrmStart.Dataset.AcceptChanges() hat den Fehler auch nicht immer behoben (komischerweise aber oft...) -> Alleine aus dem Grund war das keine sinnvolle Lösung meines Problems.

    Vielleicht auch wieder Tragisch, dass diese Info von mir noch nicht gekommen ist: Es gibt eine Berechnete Zelle im Parent-View. Sobald eine Zelle geändert wird, die dafür sorgt, dass das Ergebnis in der berechneten Parent-Zelle geändert wird, tritt das Springen auf.
    Dabei ist es unerheblich, ob die Abhängigkeit im Parent oder im Child geändert wird. Wenn ich die berechnete Zelle rausnehme ist das Problem sicher weg und tritt gar nicht mehr auf.

    Die Expression lautet IsNull(Sum(Child(FK_TblParent_TblChild).Ergebnis),0) und dann gibt es noch in der Parentview eine zweite berechnete Zelle, die aus der Addition aus mehreren Werten besteht, unter anderem der Wert aus der ChildSum.

    Wenn die Spalte berechnet wird, dann ist beim Enter Klicken in der nächsten Zeile nicht mehr die alte Spalte aktiv, sondern die erste Spalte. Kann man das ebenfalls abstellen?


    EDIT:

    Okay ich habe das ganze nachbauen können. Anbei ein Testprojekt.
    Es sind nur ein Parent und ein Child View, welche beide berechnende Spalten beinhalten. Im Parent werden alle Spalten aufsummiert. Im Child werden die beiden Spalten multipliziert und dann als Summe ins Parent übertragen (Berechneter Wert Child).
    Das unerwünschte Verhalten tritt so auf:
    Man erstelle ein paar Parent Einträge, alles gut.
    Man Wähle einen Parent Eintrag aus und erstelle zu diesem Child Einträge auf die folgende Art:
    In Spalte Wert1 etwas eintragen, dann Pfeil nach unten, wieder etwas für Wert1 eintragen, Pfeil nach unten, Etwas für Wert1 eintragen, ...
    DANN in die erste Zeile im Child gehen, Spalte Wert2. Dort etwas eintragen. Pfeiltaste nach unten.

    Nun tritt das unerwünschte Verhalten auf: in der nächsten Zeile wird dann die Spalte Wert1 ausgewählt, anstelle wie zu erwarten wieder Wert 2. Es wird also in die erste Spalte gesprungen obwohl das nicht gewollt ist.
    Dateien

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