Datensatzwechsel zeigt falschen Wert an

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Volker Bunge.

    Datensatzwechsel zeigt falschen Wert an

    Hallo zusammen,

    ich habe ein DGV mit einer Access-Datenbanktabelle verbunden. Zusätzlich zeige ich mir die einzelnen Werte auch noch über Detailfelder an. Wenn sich nun der Datensatz ändert, dann ändert sich ja auch der ID-Wert. Also rufe ich über IDTextBox_TextChanged eine Sub auf, in der ich die Datenanzeige aktualisiere. Es sollen bei dieser SUB sich ein paar Pictureboxinhalte ändern. Leider werden mir aber immer nur die Werte vom alten Datensatz im Aufruf der Subs angezeigt.

    Kann mir jemand mal einen kleinen Tipp geben, wie ich an die wirklich aktuellen Werte rankomme? In den Detailfeldern stehen ja die richtigen Werte drin.

    Das ID-Textfeld habe ich genommen, da es ja das zentrale Feld eines Datensatzes ist und somit immer einen Wert hat, der sich somit auch ständig ändert.

    Über einen Tipp wäre ich sehr dankbar.

    Schönen Samstagabend noch

    Volker
    Hallo VB1963,

    ja habe ich.

    Die Anzeige in dem DataGridView und den Detailfeldern stimmen soweit ja auch.

    Hier mal der bisherige Aufruf:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub IDTextBox_TextChanged(sender As Object, e As EventArgs) Handles IDTextBox.TextChanged
    2. Call Datensatz_wechseln()
    3. End Sub
    4. Sub Datensatz_wechseln()
    5. MsgBox(Artikel_Stammdaten_UT_EingabemaskenIDTextBox.Text)
    6. End Sub
    7. Private Sub PBox_DS_Erster_Click(sender As Object, e As EventArgs) Handles PBox_DS_Erster.Click
    8. Artikel_StammdatenBindingSource.MoveFirst()
    9. Call Datensatz_wechseln()
    10. End Sub
    11. Private Sub PB_DS_Vorheriger_Click(sender As Object, e As EventArgs) Handles PBox_DS_Vorheriger.Click
    12. Artikel_StammdatenBindingSource.MovePrevious()
    13. Call Datensatz_wechseln()
    14. End Sub
    15. Private Sub PBox_DS_Naechster_Click(sender As Object, e As EventArgs) Handles PBox_DS_Naechster.Click
    16. Artikel_StammdatenBindingSource.MoveNext()
    17. Call Datensatz_wechseln()
    18. End Sub
    19. Private Sub PBox_DS_Letzter_Click(sender As Object, e As EventArgs) Handles PBox_DS_Letzter.Click
    20. Artikel_StammdatenBindingSource.MoveLast()
    21. Call Datensatz_wechseln()
    22. End Sub


    Wenn ich mein Programm starte, dann zeigt mir die MSGBox folgende Werte an:

    1. keinen Wert (Das Programm braucht dann noch so gute 5 Sekunden, bis es alles richtig anzeigt wird)
    2. Wechsel ich nun über das DGV den Datensatz, dann wird mir 1 angezeigt. Das eigentliche Detailfeld zeigt aber hier schon 2 an. Alle anderen Feldinhalte sind hier aber auch noch die alten Werte. Erst nach dem OK wird alles andere auch aktualisiert.
    3. Gehe ich über die 4 Navigations-Pictureboxen so kommt erst der alte Wert (auch hier sind die anderen Felder noch die alten Werte). Nach dem OK drücken kommt jetzt auch der richtige Wert (auch die Feldinfos sind jetzt richtig). Somit wird zwar zweimal die Sub Datensatz_wechseln aufgerufen, aber das Ergebnis stimmt dann aber immer.

    Habe jetzt mal die ID - TextChanged deaktiviert und diese Sub eingefügt

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Artikel_StammdatenDataGridView_SelectionChanged(sender As Object, e As EventArgs) Handles Artikel_StammdatenDataGridView.SelectionChanged
    2. Call Datensatz_wechseln()
    3. End Sub


    Jetzt klappt es. Ich habe auch die Pictureboxen jetzt ohne den "Call Datensatz_wechseln" umgestellt.
    Der Effekt ist jetzt folgender:
    Es wird beim Programmstart die 1 von ersten Datensatz angezeigt, danach folgt der restliche Programmaufbau. Wechsel ich nun den Datensatz über das DGV, so wird sofort der richtige ID Wert angezeigt. Auch die restlichen Werte sind schon die richtigen. Danach werden die restlichen Anzeigen aktualisiert (Wenn die MSGBox weg ist, ist natürlich sofort alles richtig da).

    Trotzdem bleibt jetzt noch eine kleine Verständnisfrage: Warum klappt es so und nicht über die ID-TextChanged? Heißt das im Umkehrschluss, dass ich immer ein DGV (sichtbar oder unsichtbar) haben muss, damit ich sofort die richtige Anzeige bekomme?

    Grundsätzlich wäre es mir ja egal, über welches Feld ich diese Aktualisierung aufrufe.

    Ich befürchte, dass das ID Feld mit TextChanged zu früh auslöst und ich somit den alten Wert erhalte. Hingegen DataGridView_SelectionChanged löst erst nach getaner Arbeit aus (was hier ja dann richtig ist).Bin mal auf Eure Erklärung gespannt.

    Schönen Sonntag noch.
    Volker
    Du kannst deine ID auch aus der Bindingsource bestimmen, das ist auch der beste Weg...

    VB.NET-Quellcode

    1. Dim row = DirectCast(DirectCast(Artikel_StammdatenBindingSource.Current, DataRowView).Row, Artikel_StammdatenRow)
    2. Dim id = row.ID

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