buddybubble Geschrieben 27. April 2011 Geschrieben 27. April 2011 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 Zitieren
SebastianB Geschrieben 29. April 2011 Geschrieben 29. April 2011 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 Zitieren
buddybubble Geschrieben 2. Mai 2011 Autor Geschrieben 2. Mai 2011 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 Zitieren
SebastianB Geschrieben 2. Mai 2011 Geschrieben 2. Mai 2011 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 Zitieren
Guybrush Threepwood Geschrieben 2. Mai 2011 Geschrieben 2. Mai 2011 (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 2. Mai 2011 von Guybrush Threepwood Zitieren
buddybubble Geschrieben 3. Mai 2011 Autor Geschrieben 3. Mai 2011 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 Zitieren
Guybrush Threepwood Geschrieben 3. Mai 2011 Geschrieben 3. Mai 2011 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. Zitieren
buddybubble Geschrieben 3. Mai 2011 Autor Geschrieben 3. Mai 2011 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 Zitieren
Guybrush Threepwood Geschrieben 3. Mai 2011 Geschrieben 3. Mai 2011 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. Zitieren
Empfohlene Beiträge
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.