Entwickler-Ecke
Basistechnologien - Löschen von Zeilen in einer DataTable
dinazavric - Mi 04.05.11 16:56
Titel: Löschen von Zeilen in einer DataTable
Hallo,
hier ist ein Beispiel, wie man in einer Tabelle nach einem Feld suchen kann. In meinem Fall lösche ich die entsprechende Zeile gleich. Das Problem was ich nun habe ist, dass ich beim zweiten Durchlaufen eine Fehlermeldung bekomme: "Die Auflistung wurde geändert; möglicherweise wurde die Enumeration nicht ausgeführt." Logisch! Wie kann ich es aber sonst machen ohne das Problem zu bekommen?
Vielen Dank im Voraus!
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| foreach (DataRow dataRow in dataSet1.Tables["Table1"].Rows) { foreach (DataColumn dataColumn in dataSet1.Tables["Table1"].Columns) { if (dataColumn.ColumnName == "FeldXY") { dataSet1.Tables["Table1"].Rows.Remove(dataRow); } } } |
Th69 - Mi 04.05.11 17:07
Hallo,
benutze statt der foreach-Schleife eine for-Schleife (d.h. mit Index-Zugriff).
Jedoch macht deine Schleife überhaupt keinen Sinn, denn entweder es gibt die Spalte "FeldXY" und es werden dann alle Zeilen gelöscht oder aber es gibt sie nicht, und nichts passiert (d.h. dies kannst du auch kürzer schreiben ;-).
Wenn du auf die Zellinhalte zugreifen willst, dann benutze "dataRow[column]" für deinen Vergleich.
dinazavric - Mi 04.05.11 17:10
Th69 hat folgendes geschrieben : |
Jedoch macht deine Schleife überhaupt keinen Sinn, denn entweder es gibt die Spalte "FeldXY" und es werden dann alle Zeilen gelöscht oder aber es gibt sie nicht, und nichts passiert (d.h. dies kannst du auch kürzer schreiben ;-) |
das ist auch genau das was ich brauche, ich möchte alle zeilen löschen. Also alle die "FeldXY" haben... Wie kann man es kürzer schreiben?
dinazavric - Do 05.05.11 09:53
ICh habe nun das folgende Beispiel ausprobiert. Es gibt hier schon mal keine Fehlermeldung, passiert aber auch nichts. Foreach wird einfach übersprungen, sprich, keine Rows mit "FeldXY" werden gefunden, obwohl sie es im DataSet gibt... Jemand eine Idee?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| try { foreach (DataRow dr in dataSet1.Tables["Table1"].Select("FeldXY")) { dataSetPro.Tables["Table1"].Rows.Remove(dr); dataSetPro.AcceptChanges(); } } catch { Status.Text = "Error in filter expression"; } |
Trashkid2000 - Do 05.05.11 11:35
Hallo,
C#-Quelltext
1: 2: 3: 4:
| if (dataSet1.Tables["Table1"].Columns.Contains("FeldXY")) { dataSet1.Tables["Table1"].Clear(); } |
Aber ich sehe genauso wie
Th69 absolut keinen Sinn darin. Denn wenn die Tabelle die Spalte hat, so wird die ganze Table geleert.
Möchtest Du die Datensätze löschen (also auf Deleted setzen und dann bei einem Update auch in der Datenbank löschen), oder nur aus der DataTable entfernen??
Marko
dinazavric - Do 05.05.11 11:41
Vielleicht verstehe ich was nicht. Ich habe in meinem DataSet zwei Tabellen, bspw. Table0 und Table1:
Table0:
-FeldXY
-Name
Table1:
-FeldXY
-ID
-Amount
-...
Ich möchte in der Table1 alle Einträge löschen, die das ausgewählte FeldXY (wird über eine ComboBox ausgewählt) beinhalten. Natürlich möchte ich die restlichen Einträge behalten, auch die in der Table0...
Th69 - Do 05.05.11 12:17
Hallo,
du willst doch die Feldinhalte vergleichen und nicht, ob es die Spalte "FeldXY" gibt (das was ich vorher schon geschrieben habe).
Überlege noch mal genau, was du tun willst...
dinazavric - Do 05.05.11 13:18
Th69 hat folgendes geschrieben : |
Hallo,
du willst doch die Feldinhalte vergleichen und nicht, ob es die Spalte "FeldXY" gibt (das was ich vorher schon geschrieben habe).
Überlege noch mal genau, was du tun willst... |
Genau, das will ich :-) Ich möchte die Feldinhalte überprüfen und falls sie mit dem Ausgewählten übereinstimmen, die ganze Zeile löschen.
Jetzt habe ich es aber gelöst und zwar mit dem Code, was ich am Anfang gezeigt habe:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| bool founded = true; while (founded == true) { founded = false; foreach (DataRow dataRow in dataSet1.Tables["Table1"].Rows) { if (dataRow["FeldXY"].ToString() == comboBox1.Text) { dataSetPro.Tables["Table1"].Rows.Remove(dataRow); founded = true; } break; } } |
Danke an alle fürs Mitdenken :-)
Th69 - Do 05.05.11 15:50
Hallo,
schön, daß du es jetzt selbst herausgefunden hast ;-)
Aber du mußt zugeben, daß dein Anfangscode sich doch stark von deiner Lösung unterscheidet (nur weil beide zwei Schleifen verwenden, sind sie noch lange nicht gleich).
dinazavric - Do 05.05.11 15:54
Th69 hat folgendes geschrieben : |
schön, daß du es jetzt selbst herausgefunden hast ;-)
Aber du mußt zugeben, daß dein Anfangscode sich doch stark von deiner Lösung unterscheidet (nur weil beide zwei Schleifen verwenden, sind sie noch lange nicht gleich). |
Ja, das gebe ich zu, ich habe das im Laufe der Zeit schon paar mal gelöscht und wieder neu geschrieben. Es ist immer so lustig, wenn man endlich eine Lösung hat, dann denkt er "Mensch! Wie kamm ich vorher nicht drauf!" Lach :-D
mats74 - Do 14.07.11 14:49
Hallo zusammen
Ich hatte eigentlich die gleiche Problematik und habe es mit einer For-Schleife gelöst:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| for (int i = 1; i > 0; i++) { i = -1; foreach (DataGridViewRow row in dataGridView1.Rows) { if (dataGridView2.Rows[int].Cells[int].Value.ToString() == row.Cells[int].Value.ToString()) { dataGridView1.Rows.Remove(row); i = 0; break; } } } |
Da entfällt noch die Deklaration der bool-Variable.
Gruss
mats74
Th69 - Do 14.07.11 16:47
Hallo mats74,
zuersteinmal :welcome:
Es ist zwar gut, daß du helfen willst, aber dein Code ist erstens gar nicht kompilierbar [int] (du meinst wohl [i] ?) und zweitens hat die Indexvariable 'i' auch nicht die richtigen Werte, um alle Zeilen zu durchlaufen.
Und eigentlich war es gar nicht nötig, diesen älteren Beitrag wieder hervorzukramen ;-)
mats74 - Do 14.07.11 17:06
Hallo Th69
Th69 hat folgendes geschrieben : |
... aber dein Code ist erstens gar nicht kompilierbar [int] (du meinst wohl [i] ... |
Also "int" ist nicht als Variablenwert sondern als Datentyp zu verstehen.
Ist ja auch eigentlich ein Beispielcode für eine allgemeine Anwendung.
Th69 hat folgendes geschrieben : |
... und zweitens hat die Indexvariable 'i' auch nicht die richtigen Werte, um alle Zeilen zu durchlaufen ... |
Durch die Wertzuweisung i = -1; der Variable i laufe ich die foreach-Schlaufe soviele male durch, bis die gewünschte Bedingung nicht mehr erfüllt wird. Ich weiss nicht, welche falschen Werte diese Variablen besitzen sollte, um mein DataGridView nicht zu durchlaufen.
Aber Danke für den Tip.
Werde mich in Zukunft an neuere Beiträge wenden.
Gruss mats74
dark-destination1988 - Mo 18.07.11 13:23
na weil das eine endlosschleife ist, die bei nicht finden nie verlassen wird--> Programm stürzt ab
mats74 - Fr 22.07.11 14:25
dark-destination1988 hat folgendes geschrieben : |
... die bei nicht finden nie verlassen wird--> Programm stürzt ab |
Also von Endlosschlaufe sehe ich da keine Spur.
Da ich der Variable i vor der foreach-Schlaufe den Wert -1 zuweise wird die For-Schlaufe bei nicht Erfüllen der folgenden Bedingungen sowieso verlassen.
Also auch bei nicht Erfüllen der If-Anweisung.
Der Wert bleibt so oder so -1.
Bei mir funktionierts, ich lasse mich aber gerne eines Besseren belehren.
Gruss mats74
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!