Feldinhalte werden nicht aktualisiert, wenn typisierte DataRow DataRowVersion.Proposed hat

  • VB.NET
  • .NET (FX) 4.0

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Feldinhalte werden nicht aktualisiert, wenn typisierte DataRow DataRowVersion.Proposed hat

    Guten Abend zusammen,

    ich habe einen seltsamen Effekt, der mich schon sehr viel Zeit gekostet hat, vielleicht kann mir das ja jemand erklären:
    Ich habe eine typisierte DataTable in der Detailansicht auf ein Form gezogen. Die Controls sind also über eine BindingSource mit TableAdaptern verbunden.
    Klickt der Anwender auf "Neuen Datensatz", rufe ich BindingSource.AddNew() auf und speichere mir die dadurch erzeugte typisierte DataRow in einem Property des Forms.
    Und zwar darum: Neben dem direkten Eingeben/Anklicken... in die Felder gibt es noch einige Routinen, die Daten im Hintergrund manipulieren und damit Feldinhalte direkt und nicht über das UI setzen - da greife ich einfach über das Property auf die neu erzeugte DataRow zu.
    Ich habe jetzt ständig irgendwelche Nichtaktualisierungen bzw. seltsame Aktualisierungen von Feldinhalten gehabt, bis ich auf die Ursache gekommen bin:

    Das Belegen von Feldinhalten über den Code ist meist problemlos.
    Sobald ich aber einen Wert über die Oberfläche eintrage (Checkbox-Haken setzen, etwas in ein Textfeld schreiben, einen Combobox-Inhalt auswählen...), funktioniert direkt danach das Setzen von Feldinhalten per Code zwar noch, aber die Änderungen werden nicht mehr angezeigt (Beispiel: eine Liste mit Einträgen soll einen Feldinhalt der Liste in ein Textfeld als Vorgabetext kopieren - ab dem o.g. Moment wird das Textfeld nicht mehr aktualisiert, wenn man in der Liste verschiedene Einträge anklickt).

    Das liegt daran, dass das Eintragen über die Oberfläche dem DataRow-Objekt (RowState "Added") sofort die DataRowVersion "Proposed" verpasst. Ab dem Moment werden Code-Änderungen an den Feldern nicht mehr (komplett) angezeigt.
    Die Lösung ist einfach: DataRow.EndEdit() und schon klappt es wieder - bis man das nächste Feld über die Oberfläche manipuliert :cursing: ...

    Ich behelfe mir jetzt dadurch, dass ich ständig DataRow.EndEdit() aufrufe, wenn die DataRowVersion.Proposed ist. Das kann's doch aber eigentlich nicht sein, oder?...
    Mir ist klar, dass das im DataSet die verschiedenen Versionen einer DataRow sind und ich damit die Proposed-Row ("Vorgeschlagene Werte") jedes Mal auflöse und in die Current-Row überführe, aber ich verstehe nicht, warum das nötig ist.

    Ich vermute, es hängt damit zusammen, dass ich auf die Row über ein Form-globales Property zugreife und nicht immer über BindingSource.Current..., aber warum?
    Kann mir das jemand erklären, warum dem so ist?

    Vielen Dank im Voraus!
    Micha