Autor Beitrag
Talemantros
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Do 02.06.16 14:21 
Hallo,
ich habe da mal wieder ein Problem was ich so nicht verstehe
Ich habe ein DataGridView, welches mit einer BindingSource verbunden ist.

Man kann als Anwender ein Item aus dem DGV löschen mit:

ausblenden C#-Quelltext
1:
bsRechnung.RemoveCurrent();					


Am Ende möchte ich gern die Daten eine Methode als DataTable übergeben

ausblenden C#-Quelltext
1:
2:
3:
4:
DataTable dt = bsRechnung.DataSource as DataTable;
dt.Columns.RemoveAt(2);

DataTable dtRechnung = TemplateMethodsIntern.GetDataTableIDOktNummerCrapWeightPrice(dt.AsEnumerable().Select(row => (long)row[0]));


Wenn die Daten eingegeben wurden und keine Löschung vorgenommen wurde, funktioniert auch alles.
Sobald ein Eintrag gelöscht wurde sind augenscheinlich alle Daten richtig im DataTable, wenn ich es aber als dt.AsEnumerable übergeben will kommt in der letzten Zeile folgender Fehler:

Auf gelöschte Zeileninformationen kann nicht über die Zeile zugegriffen werden.

Habt ihr eine Idee was ich hier falsch mache?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 02.06.16 19:52 
Etwas aus einer DataTable löschen entfernt nicht die betroffene Row. Die Row wird nur als gelöscht markiert. Damit ein späteres abgleichen mit der Datenbanken (z.B. über einen DataAdapter) dafür ein passendes Delete Statement erzeugen kann. Die Row darf also nicht einfach verschwinden solange man sich die Option des des speicherns der Änderungen in die Datenbank offen halten will.

Wenn die DataTable an bsRechnung nicht mehr irgendwo geschrieben werden soll dann ruf vorher einmal AcceptChanges an der DataTable auf. Damit alle ausstehenden Änderung auch ~realisiert~ werden.
Wenn das nicht möglich ist dann erstell dir aus der DataTable eine neue temporäre DataTable die die gelöschten Rows nicht enthält.
Also etwa
ausblenden C#-Quelltext
1:
dt.GetChanges(DataRowState.Unchanged).AsEnumerable().Select(row => (long)row[0]))					

DataRowState mußt du passend ergänzen wenn da noch modifizierte oder neue Rows in der DataTable stecken.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Fr 03.06.16 14:42 
Vielen Dank.
Wieder ein PuzzleStück mehr :-)

Gruß