web-dev-qa-db-fra.com

Attendez une seconde dans le programme en cours

dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);

Je veux attendre une seconde avant d’imprimer mes cellules de grille avec ce code, mais cela ne fonctionne pas. Que puis-je faire?

78
Selçuklu Ebrar

Est-ce une pause, mais vous ne voyez pas votre couleur rouge apparaître dans la cellule? Essaye ça:

dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);
133
Matt Dawdy

Personnellement, je pense que Thread.Sleep est une mauvaise implémentation. Il verrouille l'interface utilisateur, etc. Personnellement, j'aime les implémentations de minuteur, car il attend puis se déclenche.

Utilisation: DelayFactory.DelayAction(500, new Action(() => { this.RunAction(); }));

//Note Forms.Timer and Timer() have similar implementations. 

public static void DelayAction(int millisecond, Action action)
{
    var timer = new DispatcherTimer();
    timer.Tick += delegate

    {
        action.Invoke();
        timer.Stop();
    };

    timer.Interval = TimeSpan.FromMilliseconds(millisecond);
    timer.Start();
}
26
Mark Rowe

Fonction d'attente à l'aide de minuteries, pas de verrous d'interface utilisateur.

public void wait(int milliseconds)
    {
        System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
        if (milliseconds == 0 || milliseconds < 0) return;
        //Console.WriteLine("start wait timer");
        timer1.Interval = milliseconds;
        timer1.Enabled = true;
        timer1.Start();
        timer1.Tick += (s, e) =>
        {
            timer1.Enabled = false;
            timer1.Stop();
            //Console.WriteLine("stop wait timer");
        };
        while (timer1.Enabled)
        {
            Application.DoEvents();
        }
    }

Utilisation: il suffit de placer ceci dans votre code qui doit attendre:

wait(1000); //wait one second
10
Said

Attendre ne sera pas un grave inconvénient s’il est court. Dans mon cas, il était nécessaire de donner un retour visuel à l'utilisateur en faisant clignoter un contrôle (il s'agit d'un contrôle graphique pouvant être copié dans le Presse-papiers, ce qui modifie son arrière-plan pendant quelques millisecondes). Cela fonctionne bien de cette façon:

using System.Threading;
...
Clipboard.SetImage(bm);   // some code
distribution_chart.BackColor = Color.Gray;
Application.DoEvents();   // ensure repaint, may be not needed
Thread.Sleep(50);
distribution_chart.BackColor = Color.OldLace;
....
2
ChrisW

utilisez dataGridView1.Refresh(); :)

1
Coder SAJDFJF

Essayez cette fonction

public void Wait(int time) 
{           
    Thread thread = new Thread(delegate()
    {   
        System.Threading.Thread.Sleep(time);
    });
    thread.Start();
    while (thread.IsAlive)
    Application.DoEvents();
}

Fonction d'appel

Wait(1000); // Wait for 1000ms = 1s
0
Savaş SERTER

Je me sens comme si tout ce qui n'allait pas ici était la commande, Selçuklu souhaitait que l'application attende une seconde avant de remplir la grille. La commande Veille aurait donc dû arriver avant la commande de remplissage.

    System.Threading.Thread.Sleep(1000);
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
0
Colin D