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

[C#] Form paint forceren?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een form waar ik in runtime controls aan toevoeg (de form is een wizard zeg maar); bij de laatste stap van de wizard, moet hij het een en ander uitvoeren. Dit doe ik door in een foreach {} lus een method aan te roepen uit een zelf geschreven class. Op zich werkt het allemaal.

Ik zit alleen met het volgende probleem:
In de laatste stap maak ik een DataGridView control aan met een aantal rows (dit zijn zeg maar dezelfde items die in de foreach lus geprocessed worden). Ik krijg echter pas de gridview te zien wanneer de hele foreach lus door is gelopen.
Wat ik eigenlijk wil, is dat bij elke keer dat de foreach lus wordt doorlopen, de betreffende row in de DataGridView wordt veranderd. Aan het begin van de lus komt wordt een icoon getoond "In Progress", aan het eind van de lus "OK" of "ERROR".

Hoe krijg ik het voor elkaar dat de GridView getoond wordt én dat deze geupdate wordt vanuit de foreach lus (zodat ik de progress kan zien van de items)?

(hopelijk heb ik het een beetje duidelijk uitgelegd :+ )

  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 16-11 16:38

giMoz

iets met meester...

DataGridView.Update();
of
Application.DoEvents();
zou de truc moeten doen

Of niet natuurlijk...


  • neothor
  • Registratie: Oktober 2004
  • Laatst online: 02-10-2023
Zoek eens op Background worker.
Daarmee kan je dit volgens mij vrij makkelijk doen.

Last.fm | LinkedIn | Twitter


Verwijderd

Topicstarter
Het punt is dat ik uberhaupt de hele DataGridView niet te zien krijg totdat de lus afgelopen is.

En ik dacht dat de Update() in een DataGridView te maken had met de DataSource? Ik gebruik namelijk geen DataSource in mijn DataGridView; de rows worden er "handmatig" in gezet.

Ik zit zelf te denken dat het misschien kan lukken met Threading?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ja daarom zegt neothor ook dat je naar de background worker moet kijken. Dat is "gewoon" een andere thread die wat functionaliteit heeft ingebouwd om met de GUI thread te ouwehoeren.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • mOrPhie
  • Registratie: September 2000
  • Laatst online: 20-11 11:59

mOrPhie

❤️❤️❤️❤️🤍

Dit is een mogelijke implementatie:

http://www.osix.net/modules/article/?id=832

Ook toepasbaar op de datagridview en dan zonder de threadsleep van 1 seconde die hij in dit voorbeeld gebruikt. Om het flikkeren tegen te gaan kun je dubble-buffering toepassen:

C#:
1
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.


  • Laurens-R
  • Registratie: December 2002
  • Laatst online: 29-12-2024
Met invalidate en update zou het ook moet lukken volgens mij.

Met de invalidate method dwing je toch een repaint af?

  • mOrPhie
  • Registratie: September 2000
  • Laatst online: 20-11 11:59

mOrPhie

❤️❤️❤️❤️🤍

EvilB2k schreef op dinsdag 04 maart 2008 @ 10:36:
Met de invalidate method dwing je toch een repaint af?
Ja, maar dat is niet wat hij wil. Het is namelijk zo dat bij het toevoegen van een row invalidate al wordt aangeroepen under the hood. Er is zelfs een methode (beginupdate + endupdate bij de listview, bij datagrid weet ik zo nu uit m'n hoofd) om te forceren dat de control pas invalidates bij endupdate. :)

Het punt hier is gewoon dat de thread druk bezig is met de for-loop en daarom niet aan painten toe komt. :)

Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.


  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 17-11 15:47
Backgroundworker is de oplossing zoals neothor al aangaf. De GUI thread is eingelijk niet bedoeld om zwaar verwerkingswerk te doen onderwater. Daarvoor maak je gebruik van andere threads. Het is nl. ook vrij irritant voor de gebruiker dat het hele programma niet reageert (Zijn ze geneigd te denken dat je applicatie hangt en killen ze em misschien). Het is dus aan te raden om de GUI thread beschikbaar te houden voor interactie met de gebruiker, zodat deze denkt dat het programma druk in de weer is met allerlei toestanden terwijl hij toch in de gaten heeft dat het programma niet hangt.

Mess with the best, die like the rest


Verwijderd

Topicstarter
BackgroundWorker... dat gaat m worden, ik voel t gewoon aan mn water ;)
Ik ga er eens mee aan de gang. Thanx!
Pagina: 1