2010-07-31 3 views
1

Divers contrôles (principalement des étiquettes et des panneaux) sur mon formulaire C# WinForm relativement simple ne sont pas peints lorsque le formulaire est affiché. Ils finissent d'être peints environ une demi-seconde après la présentation du formulaire.Le formulaire est affiché avant que les contrôles ne soient peints

Y at-il une solution facile à cela?

Plus de détails:

Le panneau qui peint le plus lent affiche des données lues à partir d'une base de données SQL. Les données sont peintes, par les étiquettes de texte et l'arrière-plan ne sont pas. Le panneau contient une très petite quantité de données extraites de la base de données.

Un autre panneau qui finit de peindre après l'apparition du formulaire ne contient que quelques étiquettes, un contrôle de texte et un bouton. De plus, cette forme repose sur une autre forme dont le seul but est de recouvrir l'écran de l'ordinateur d'un arrière-plan semi-transparent. Lorsque je supprime ce formulaire d'arrière-plan de l'application, les mêmes contrôles n'arrivent toujours pas à finir de peindre avant que le formulaire ne s'affiche (mais maintenant ils ne sont peints que d'environ un quart de seconde au lieu d'environ une demi-seconde).

+0

Il semble qu'il y ait un ou plusieurs contrôles sur le formulaire qui ralentissent la peinture - quels composants sont affichés sur le panneau gênant? –

+0

@Will, un panneau a un groupBox qui contient trois étiquettes, une zone de texte et un bouton. L'autre panneau a un groupBox qui contient un deuxième panneau qui a six étiquettes et un troisième panneau, ce troisième panneau montre des données tirées d'une base de données SQL (les données sont juste quelques rangées de noms de compte d'utilisateur). – Frederick

+0

Comment les données SQL sont-elles affichées sur le troisième panneau - est-ce que ce panneau est dessiné par le propriétaire, ou contient-il par ex. un DataGridView? –

Répondre

1

Il s'agit du comportement de rendu Windows User32 standard. La forme et la plupart des contrôles sont des fenêtres individuelles. Ils reçoivent chacun un message WM_PAINT pour leur dire qu'ils doivent se peindre eux-mêmes, ces messages sont envoyés un à un dans chaque fenêtre, dans l'ordre Z. Quand un contrôle est lent à se peindre, cela devient perceptible. Le rectangle non peint de ce contrôle, et ceux qui le suivent, sont visibles pendant un bref instant.

Les techniques standard de double-buffering disponibles dans Windows Forms ne peuvent pas résoudre ce problème, vous devez double-buffer le formulaire entier. C'est possible, ma réponse en this thread vous montre comment.

+0

Oui, cela semble l'avoir fait (j'ai besoin de le tester un peu plus pour être sûr). Encore une fois, merci pour votre aide. – Frederick

Questions connexes