Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#.NET]DataRow verwijderen in foreach-loop

Pagina: 1
Acties:
  • 443 views sinds 30-01-2008
  • Reageer

  • Razr
  • Registratie: September 2005
  • Niet online
Ik loop met een foreach loop door een DataTable heen, nu wil ik een bepaalde rij verwijderen maar dan krijg ik de foutmelding dat de verzameling is veranderd (logisch er is een rij weg) en dat er niet verder 'gelooped' kan worden.

C#:
1
2
3
4
5
foreach(DataRow r in dt.Rows)
{
  if(r["blaat"] == "verwijdermij")
    r.delete();
}


Dit gaat dus een fout geven, ik heb al geprobeerd de rij later te verwijderen door middel van dt.Rows.RemoveAt(index) maar dan heeft het geen nut meer. Is is voor de werking noodzakelijk dat de rij TIJDENS de loop word verwijderd.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Geen for-each gebruiken maar for (int x=blah.rowcount-1; x>=0; x--) ofzo.

[ Voor 20% gewijzigd door RobIII op 05-09-2007 17:34 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:52
Een for gebruiken, zoals rob zegt...

Maar dan wel van achter naar voor loopen ipv van voor naar achter. :)
for( int i = dt.Rows.Count - 1; i >= 0; i-- )
dus.

[ Voor 19% gewijzigd door whoami op 05-09-2007 17:33 ]

https://fgheysels.github.io/


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
whoami schreef op woensdag 05 september 2007 @ 17:33:
Maar dan wel van achter naar voor loopen ipv van voor naar achter. :)
Inderdaad, dat was ik vergeten erbij te zeggen ;) Post is aangepast.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:52
rowcount -1, anders ga je buiten de bounds van die collectie. :P

https://fgheysels.github.io/


  • Spiral
  • Registratie: December 2005
  • Niet online
Lees dit draadje ook eens even door ter informatie dan weet je waarom je tegen de fout aanloopt.

\[.NET C#] foreach doorloopt niet alle elementen

To say of what is that it is not, or of what is not that it is, is false, while to say of what is that it is, and of what is not that it is not, is true. | Aristoteles


  • Razr
  • Registratie: September 2005
  • Niet online
Bedankt voor de hulp! :)
Spiral schreef op woensdag 05 september 2007 @ 18:35:
Lees dit draadje ook eens even door ter informatie dan weet je waarom je tegen de fout aanloopt.

\[.NET C#] foreach doorloopt niet alle elementen
Zal ik zeker doen!

  • Ruben314
  • Registratie: Juli 2001
  • Laatst online: 04-11 21:14
Waarom moet je van achter naar voor lopen? Van voor naar achter werkt toch ook prima?

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Anders slaat hij 1 over nadat hij een rij gedelete heeft.

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:52
Probeer maar eens. :)

Als je meer dan één item uit de lijst wilt verwijderen, en je loopt van voor naar achter door die lijst, dan zullen niet alle items verwijderd worden. Je veranderd je index nl. , en je zal dus met een for niet alle items overlopen.
Je kan dit het beste uittesten / zien door bv eens een listbox op een form te droppen, met wat items in. Zorg ervoor dat die listbox 'multiselect' is.
Drop ook een button op je form, en schrijf eens code in de click-eventhandler van die button dat de geselecteerde items in die listbox moeten verwijderd worden. Doe dat eens met een for loop die je van 0 -> count doet lopen.

https://fgheysels.github.io/


  • Ruben314
  • Registratie: Juli 2001
  • Laatst online: 04-11 21:14
ah, meerdere items. Niet aan gedacht idd.

Had zelf vorige week hetzelfde probleem, vandaar mijn opmerking. Bij mij echter altijd maar hooguit één te verwijderen item.

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Je gebruikt een for(each) loop om 1 item uit je datatable te verwijderen? Waarom gebruik je dan niet Select() om die specifieke row op te zoeken en hem dan te verwijderen.

C#:
1
2
3
DataRow[] rows = dt.Select("Blaat == 'verwijdermij' ");
for( int i = rows.Length - 1; i >= 0; i-- )
    rows[i].Delete();


(dit voorkomt dat je alle rows uit de datatable doorloopt)

If it isn't broken, fix it until it is..


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:52
Ik geloof dat die Select in bepaalde gevallen ook wel een loopje zal gebruiken. :)
(Als er geen index op de datacolumn ligt bv waar je op filtert, of als het over een kleine set gegevens gaat)

https://fgheysels.github.io/


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Aangezien TS op dit veld filtert mag ik wel aannemen dat er een index op deze kolom staat. Indien niet --> direct aanmaken.. ;-)

Ook als het een kleine set bevat. DataSets bevatten een hoop optimalisaties om 'collecties' te managen. Daarnaast vind de CLT het niet leuk als bij een row blaat de value 'null' heeft. Dan krijg je errors. Select vangt dit soort zaken (net als een database zelf) voor je af.

If it isn't broken, fix it until it is..

Pagina: 1