2010-03-31 6 views
1

alors j'ai eu ce morceau de code. (currPosX est défini plus tôt)Les graphiques ne dessinent pas lorsque la condition de boucle est dates. C#, winForms

while (earliestDate < DateTime.Today) 
     { 
      currPosX = currPosX + 5; 
      e.Graphics.DrawLine(Pens.Black, currPosX, 0, currPosX, 10); 

      earliestDate = earliestDate.AddDays(1); 
     } 

les graphiques ne dessinent pas. C'est vraiment bizarre, car cela n'arrive que lorsque l'instruction condition est une comparaison de date. J'ai débogué, et ça va dans la boucle, et les valeurs sont corrompues (currPosX par exemple). Mais, pas d'affichage. Encore une bizarrerie, si j'ajoute un MessageBox.Show ("blabla") dans la boucle, la boîte de message apparaît, et les graphiques sont dessinés. que se passe t-il ici?

EDIT: juste pour vous rappeler les gars, quand il est une condition de non-datetime, cela fonctionne. ce qui signifie que ce code fonctionne. il affiche une série de lignes

int i = 0; 

     while(i < 10) 
     { 
      currPosX = currPosX + 5; 
      e.Graphics.DrawLine(Pens.Black, currPosX, 0, currPosX, 10); 
      i++; 
     } 

Répondre

2

Comme vos tests indiquent, la question n'a rien à voir avec la comparaison des années DateTime. Puisque votre code entre dans la boucle, et que vous savez que la peinture est en cours, quelque chose d'autre doit se passer. Nous aurons probablement besoin de voir plus de code pour identifier le problème

Essayer de parcourir le code de peinture est inutile. Le fait que le débogueur et le commerce de fenêtre d'application se concentrent complètement foiré les choses. Vous êtes mieux d'utiliser tracepoints, pas de points d'arrêt.

Mais voici quelques possibilités:

  • Etes-vous sûr que vos coordonnées sont dans la zone client visible du contrôle?
  • Faites-vous ce qui précède dans l'événement Paint du contrôle? Etes-vous en train d'oublier d'invalider le contrôle en utilisant la méthode Invalidate ou Refresh?
  • Dessinez-vous sur le fil de l'interface utilisateur?
  • Avez-vous défini des styles de contrôle non standard?

MISE À JOUR En réponse à votre édition:

Votre problème est que earliestDate gardera rampant vers l'avant parce que vous modifiez dans votre événement de peinture et la valeur persistent entre les événements de peinture. Les événements de peinture se répètent chaque fois que le contrôle est invalidé. Vous avez deux options.

  1. Copie earliestDate à une variable locale en cas de peinture et d'utiliser cette
  2. Réinitialiser earliestDate à sa valeur de départ à la fin de l'événement.

Je propose l'option 1.

+0

oui, zone visible. oui, dans l'événement Paint. invalider ou rafraîchir ne fonctionne pas, rien ne se passe. Je ne sais pas ce qu'est le fil de l'interface utilisateur. Je ne sais pas quel est le style de contrôle. vérifier ma modification – jello

+0

J'ai mis à jour ma réponse en réponse à vos modifications. – Josh

+0

J'ai utilisé votre solution n ° 1, et cela fonctionne. Merci – jello

0

DateTime n'est pas une mesure précise, le retard de la boîte de message aide cependant.
Utilisez plutôt PreformanceCounter de .NET (mesurez le temps écoulé avant d'entrer la boucle).

3

Je l'ai fait un projet de test simple qui a juste une forme sans contrôle sur elle (le code est ci-dessous). Comme vous pouvez le voir, j'ai ajouté un petit code dans le constructeur pour initialiser les premières données afin que la boucle while de l'événement Paint soit exécutée une fois. Également codé en dur la valeur currPos.

Si vous exécutez ceci, il tracera une ligne verticale comme prévu. Mais si vous faites quelque chose qui invalide les graphiques (par exemple, minimiser et restaurer le formulaire), il ne sera pas redessiner les graphiques. Donc, il dessine une fois, mais ne dessine pas encore pendant 24 heures!

public partial class Form1 : Form 
{ 
    DateTime earliestDate; 
    public Form1() 
    { 
     earliestDate = DateTime.Now; 
     earliestDate = earliestDate.AddDays(-1); 
     InitializeComponent(); 
    } 

    private void Form1_Paint(object sender, PaintEventArgs e) 
    { 
     while (earliestDate < DateTime.Today) 
     { 
      float currPosX = 0; 
      currPosX = currPosX + 5; 
      e.Graphics.DrawLine(Pens.Black, currPosX, 0, currPosX + 5, 10); 

      earliestDate = earliestDate.AddDays(1); 
     } 
    } 
} 
+0

+1 Génial! Cela semble être le problème. –

+0

thx, mais votre code n'est pas bon pour moi, parce que j'ai 2 panneaux. le panneau supérieur comporte une barre de défilement, et lorsque vous le faites défiler, le panneau inférieur (qui contient les graphiques) doit suivre. donc, à moins que je ne me trompe, le contrôle doit redessiner chaque fois que je fais défiler le panneau supérieur – jello

+0

Vous avez raison que vous devez redessiner chaque fois. Ce code n'était pas destiné à résoudre le problème - il était juste montré un test qui confirme que vous ne pouvez pas ignorer le redessin. –

Questions connexes