Autor |
Beitrag |
dinazavric
      
Beiträge: 75
|
Verfasst: Mi 04.05.11 16:56
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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: dinazavric
|
|
dinazavric 
      
Beiträge: 75
|
Verfasst: Mi 04.05.11 17:10
|
|
dinazavric 
      
Beiträge: 75
|
Verfasst: 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
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: 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
Für diesen Beitrag haben gedankt: dinazavric
|
|
dinazavric 
      
Beiträge: 75
|
Verfasst: 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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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...
Für diesen Beitrag haben gedankt: dinazavric
|
|
dinazavric 
      
Beiträge: 75
|
Verfasst: 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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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).
Für diesen Beitrag haben gedankt: dinazavric
|
|
dinazavric 
      
Beiträge: 75
|
Verfasst: Do 05.05.11 15:54
|
|
mats74
      
Beiträge: 189
Erhaltene Danke: 26
Win 10
VS 2017/19, C++, C#
|
Verfasst: 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
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 14.07.11 16:47
Hallo mats74,
zuersteinmal
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
      
Beiträge: 189
Erhaltene Danke: 26
Win 10
VS 2017/19, C++, C#
|
Verfasst: 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
      
Beiträge: 178
Erhaltene Danke: 21
|
Verfasst: Mo 18.07.11 13:23
na weil das eine endlosschleife ist, die bei nicht finden nie verlassen wird--> Programm stürzt ab
|
|
mats74
      
Beiträge: 189
Erhaltene Danke: 26
Win 10
VS 2017/19, C++, C#
|
Verfasst: 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
|
|