Benutzer mit den meisten Antworten
Wie geänderte DataSet DataTables über DataView zurückschreiben ?

Frage
-
Hallo,
Form1: ich habe DataSet ds1 mit 3 DataTabellen
Form2: kopiere DataSet ds2 = Form1.ds1.Copy();
über DataView und DataRowView ändere/NeuEinfügen/Löschen nehme ich Änderungen vor
über ds2.AcceptChanges(); Änderungen speichern
Form1.ds1 = this.ds2;
Form1: die Änderungen sind nicht sofort übernommen, aber wenn ich Form2 nochmals aufrufe sind die Änderungen alle da
Frage: Warum ?
Antworten
-
Hi,
entschuldige bitte. Mein Beitrag war falsch und ich habe ihn korrigiert.Hier mal eine Demo zu deinem Szenario, mit dem ich dein Problem nicht reproduzieren kann. Wichtig dabei ist, dass eine Änderung des Inhaltes der Verweisvariable (ds1=ds2) nicht automatische auch vorherige Kopien (DataSource=ds1) aktualisiert. Das ist dann anchzuholen.
private void Form1_Load(object sender, EventArgs e) { // declare variable DataGridView dg = new DataGridView() { Dock = DockStyle.Fill }; DataSet ds1 = new DataSet(); ; DataSet ds2; Form frm2 = new Form() { Text = "Form2" }; // load data var dt = ds1.Tables.Add(); dt.Columns.Add("Data", typeof(string)); for (int i = 1; i < 10; i++) dt.Rows.Add($"row {i}"); // prepare Form1 this.Text = "Form1"; this.Controls.Add(dg); dg.DataSource = ds1.Tables[0]; // Prepare Form2 and show DataGridView dg2 = new DataGridView { Dock = DockStyle.Fill }; frm2.Controls.Add(dg2); ds2 = ds1.Copy(); dg2.DataSource = ds2.Tables[0]; frm2.Show(); // ruturn to Form1 ds2.AcceptChanges(); ds1 = ds2; dg.DataSource = null; dg.DataSource = ds1.Tables[0]; }
--
Best Regards / Viele Grüße
Peter Fleischer (former MVP for Developer Technologies)
Homepage, Tipps, Tricks
- Bearbeitet Peter Fleischer Mittwoch, 24. Juni 2020 06:11
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 29. Juni 2020 07:00
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 10. Juli 2020 10:22
Alle Antworten
-
Hi,
mit ds2.AcceptChanges werden die Zustände der Datenzeilen im ds2 auf unverändert gesetzt.Das bedeutet, dass alle im ds2 in den einzelnen Tabellen hinzugefügten Datensätze gelöscht werden. Alle geänderten Datensätze und alle gelöschten Datensätze werden auf die Originalwerte zurückgesetzt. Gespeichert wird da nichts.Korrektur, da die Ausführungen CancelChanges betreffen:
Für AcceptChanges bedeutet das, dass alle im ds2 in den einzelnen Tabellen hinzugefügten Datensätze in den Status "unverändert" (unchanged) gesetzt werden und die hinzugefügten Werte als Originalwerte abgelegt werden. Alle geänderten Werte ersetzen die ehemaligen Originalwerte, alle zur Löschung "markierten" Datensätze werden entfernt. Ein Speichern der im ds2 durchgeführten Veränderungen kann danach nicht mehr in eine (externe) Datenquelle gespeichert werden, da alle Daten den Zustand "unverändert" haben.
Um dein Problem genauer analysieren zu können, müsste man etwas mehr Code (als Beispiel) und die genaue Ablauffolge sehen.
--
Best Regards / Viele Grüße
Peter Fleischer (former MVP for Developer Technologies)
Homepage, Tipps, Tricks
- Bearbeitet Peter Fleischer Mittwoch, 24. Juni 2020 03:22
-
Hi,
in der Beschreibung von AcceptChanges(), "Führt einen Commit für alle Änderungen aus, die an diesem DataSet seit dem letzten Ladevorgang oder seit dem letzten Aufruf von AcceptChanges vorgenommen wurden".
Wie könnte ich dies jetzt lösen ?
mfg
- Bearbeitet ati.sah Dienstag, 23. Juni 2020 21:01
-
Hi,
entschuldige bitte. Mein Beitrag war falsch und ich habe ihn korrigiert.Hier mal eine Demo zu deinem Szenario, mit dem ich dein Problem nicht reproduzieren kann. Wichtig dabei ist, dass eine Änderung des Inhaltes der Verweisvariable (ds1=ds2) nicht automatische auch vorherige Kopien (DataSource=ds1) aktualisiert. Das ist dann anchzuholen.
private void Form1_Load(object sender, EventArgs e) { // declare variable DataGridView dg = new DataGridView() { Dock = DockStyle.Fill }; DataSet ds1 = new DataSet(); ; DataSet ds2; Form frm2 = new Form() { Text = "Form2" }; // load data var dt = ds1.Tables.Add(); dt.Columns.Add("Data", typeof(string)); for (int i = 1; i < 10; i++) dt.Rows.Add($"row {i}"); // prepare Form1 this.Text = "Form1"; this.Controls.Add(dg); dg.DataSource = ds1.Tables[0]; // Prepare Form2 and show DataGridView dg2 = new DataGridView { Dock = DockStyle.Fill }; frm2.Controls.Add(dg2); ds2 = ds1.Copy(); dg2.DataSource = ds2.Tables[0]; frm2.Show(); // ruturn to Form1 ds2.AcceptChanges(); ds1 = ds2; dg.DataSource = null; dg.DataSource = ds1.Tables[0]; }
--
Best Regards / Viele Grüße
Peter Fleischer (former MVP for Developer Technologies)
Homepage, Tipps, Tricks
- Bearbeitet Peter Fleischer Mittwoch, 24. Juni 2020 06:11
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 29. Juni 2020 07:00
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 10. Juli 2020 10:22