Zum Inhalt springen

Abfrage der RowState Eigenschaft in einem DataSet


Empfohlene Beiträge

Geschrieben

Hallo.

Ich arbeite an einem Control, das folgendermaßen aufgebaut ist:

Links ist eine Liste (DataGridView) mit Kostenstellen, rechts textboxen, in denen Informationen zu der links gewählten Kostenstelle angezeigt werden.

Einige der Textboxen sollen Änderungen erlauben, die späte gespeichert werden können sollen.

Enthalten sind die Daten in einer gemeinsamen DataTable, die sich in einem DataSet befindet.

Das DataSet wird beim Laden der Form automatisch gefüllt (funktioniert)

Sowohl das DataGridView als auch die Textboxen sind Datengebunden, d.h. sie zeigen automatisch den aktuellen wert der aktiven Zeile im DataSet an.

Wähle ich jetzt im DataGridView einen Eintrag aus, werden automatisch die Textboxen angepasst, funktioniert alles.

Aber jetzt das erste Problem:

Ändere ich den Text in den Textboxen wird ja automatisch eine Änderung an der DataRow im DataSet durchgeführt (lässt sich dadurch bestätigen, dass die Änderung auch im DataGridView angezeigt wird).

Frage ich jetzt aber den RowState dieser Zeile ab, steht er immer noch auf Unchanged. Obwohl die Zeile eindeutig modifiziert wurde.

Das konnte ich umgehen, indem ich das Validated Event der Textboxen abfange (wird geworfen, sobald der Focus eine Textbox verlassen will) und DataRow.EndEdit() ausführe.

Wurden änderungen vorgenommen, so wird der RowState richtig als Modified erkannt.

Wäre ja auch ok, jetzt habe ich allerdings die Anomalie, dass der RowState manchmal auch mit Modified angegeben wird, selbst wenn ich nichts eingebe und nur aus der Liste links neue Kostenstellen anzeigen lasse (aber eben nur manchmal, wenn eine Kostenstelle wiederholt angeklickt wird :confused: ).

Mein Problem ist im großen und ganzen folgendes:

Ich verstehe nicht, wie und wann der RowState automatisch gesetzt wird.

  • Wird BeginEdit() automatisch aufgerufen wenn eine Textbox betreten wird, EndEdit() aber nicht automatisch beim verlassen?
  • Wird bei einem RowEnter (auswahl einer neuen Kostenstelle im DataGridView) automatisch ein AccepChanges() ausgeführt? (würde den RowState ja auch zurücksetzen)

Nochmal eine zusammenfassung der Aufgabe meines Controls (vereinfacht):

Daten aus einer Tabelle anzeigen, auswahl einer Zeile im DataGridView, anzeige der Details in Textboxen.

Erkennen von Änderungen über den RowState einer Row im DataSet

Das kann doch nicht so schwer sein :confused:

P.S.: Das ganze muss Datengebunden sein, ich darf die Textboxen nicht manuell füllen, ich darf auch keine Usereingaben abfragen um Änderungen zu erkennen. Alle Operationen müssen auf Datenebene (DataSet) ausgeführt werden.

MfG buddybubble

Geschrieben

Zu deinem ersten Problem: Ich denke das liegt daran das du bei jedem Verlassen der TextBox ein EndEdit() aufrufst. Dadurch wird dann der der Modified-Eintrag gesetzt. Versuch doch einfach mal eine Abfrage einzubauen. In dieser stellst du einfach fest ob sich der Text in der Textbox überhaupt geändert hat.

LG,

Sebastian

Geschrieben

Aber ich will ja nicht auf Ebene der Textbox (dient ja nur zur Anzeige) sondern auf Datenebene (Tabelle im DataSet) arbeiten :/

Das würde gegen das Design verstoßen, für das wir uns entschieden haben

Geschrieben

Hi,

du hast meine Idee nicht ganz verstanden. Dadurch, das du eine Zeile in deinem GridView mehrfach klickst, kommt es zu diesem Fehler. Wenn du jetzt aber einfach vor dem Starten des BeginEdit() oder EndEdit() abfragst, ob sich überhaupt ein Wert geändert hat, kannst verhindern das das Modified falsch gesetzt wird. Vergleich hierzu den Text der Box und den deines Eintrags der Grid-Column. Ich denke das stört kein Softwaredesign. Ansonsten stimmt deine Fehlerbeschreibung nicht, bzw. ist Sie im wichtigen Bereich nicht genau genug.

LG

Geschrieben (bearbeitet)

Doch tut es weil es den Automatismus der hier geboten wird ad absordum führt ;)

@buddybubble

schau mal ob dir das hier evtl. weiterhilft Row always modified after a Bindingsource.EndEdit()

EDIT: Ansonsnten könntest du mal versuchen das Problem in einem ganz einfachen Projekt nur mit DataGrid nachzustellen so dass jemand anderes das auch mal ausprobieren kann.

Bearbeitet von Guybrush Threepwood
Geschrieben

Ich kann den Code leider nicht einfach posten:

1. Inzwischen über 800 Zeilen

2. Bestandteil eines großen Projekts, funktioniert nicht seperat

3. Denke das darf ich dank firmenpolitik etc nicht.

Ich kann auch nicht einfach ein Beispiel nachbauen, das ds wird schließlich über eine MySql Db gefüllt, der geneigt Helfer müsste ja eine Datenbank mit gleichen Schema haben :(

Ich habe den Fehler jetzt auch genau lokalisiert, ist reproduzierbar.

Hier der genaue Ablauf:

(savedState wird beim verlassen einer Textbox (validating event) über den RowState bestimmt (vorher ds.EndEdit())

Control wird geladen

DataSet wird gefüllt und im DataGridView + Textboxen angezeigt

ich verlasse die erste Zeile im dgv, 2. row wird angezeigt.

Ich verlasse die zweite Row und gehe wieder in die erste Row, Row wird angezeigt.

Ich verlasse die erste Zeile wieder und will eine andere Row betreten. Auf einmal hat sich der RowState von Row 1 geändert ???

Dieser Bug tritt nur bei Row 1 (also Index 0) auf und auch erst beim 2. verlassen dieser Row.

Der wechsel zwischen allen anderen Rows funktioniert beliebig oft Problemlos.

Der Focus verlässt das dgv übrigens nicht, es werden keinerlei Eingaben getätigt.

Aber es kommt noch besser:

Dieser Bug tritt nur einmal auf.

Tritt er auf, hat der User die möglichkeit die Änderungen zu speichern oder zu verwerfen, was in einem ds.AcceptChanges() oder ds.RejectChanges() resultiert.

Danach tritt der Bug nicht wieder auf.

Es sei denn, man leert das DataSet und befüllt es erneut, dann ist wieder alles beim alten.

Langsam bin ich echt ratlos und glaube an einen Bug im Framwork :upps

MfG

Geschrieben

Wenn du ein Beispielprojekt erstellst musst du es ja nicht genau mit diesen Daten füllen. Du kannst ja auch einfach ein DataSet im Code manuell mit ein paar Daten füllen wenn sich der Fehler dann nachvollziehen lässt.

Wenn es sich wirklich um einen .Net Bug handeln sollte wird MS auch erst helfen (können) wenn du ihnen ein Projekt gibst das den Fehler reproduziert.

Ansonsten denke ich nicht das wir dir hier helfen können wenn nicht jemand anderes dieses Problem auch zufälligerweise hatte.

Geschrieben

Ich habe einen Workaround gefunden und gleichzeitig den Fehler genauer eingegrenzt:

Der Fehler hat mit der ComboBox zu tun, die im Control angezeigt wird.

Die Combobox wird über eigene seperate Tabelle gefüllt, SelectedValue wird jedoch von der Tabelle die alle anderen Daten bereitstellt gesetzt (Foreign Key etc). Das funktioniert soweit auch gut, führte aber zu oben beschriebenem Bug.

Dummerweise brauche ich die ComboBox so wie sie ist, aber ich habe rausgefunden wie man den Fehler umgehen kann:

Man muss einfach die Ansicht im DataGridView ändern.

Sortiert man das dgv nach einer Column, tritt der Bug nicht mehr auf.

Ich mache jetzt folgendes:

DataSet wird gefüllt und im Dgv angezeigt.

Dgv wird nach Column[0] Descending sortiert

DGV wird nach Column[0] Ascending sortiert

Sieht im Endeffekt genauso aus, allerdings tritt der Bug mit dem RowState dann nicht mehr auf.

Ich denke dass das nichts mit meinen Daten etc. zu tun hat, sondern einfach ein Bug von .net im Zusammenspiel von DataGridView, DataSet und ComboBox ist. :upps

Geschrieben

Ich glaube ehrlich gesagt nicht das es ein .Net Bug ist sondern irgendwie mit deiner Datenbindung zusammenhängt. Evtl. zum Beispiel das das selectedValue der Combobox erst gesetzt wird wenn er mit dem generieren der Zeile eigentlich schon fertig war und die Zeile dadurch dann halt geändert wurde.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...