2009-08-06 8 views
2

Supposons que vous ayez un bouton sur un formulaire qui compte jusqu'à 1000 dans une zone de texte, puis l'efface.Est-il possible d'éviter plusieurs clics sur un formulaire Winform?

Si je clique cinq fois rapidement sur le bouton (en cours d'exécution), le gestionnaire d'événements Click sera appelé 5 fois et je verrai le compte à cinq reprises.

Est-il possible de désactiver d'autres clics sur ce bouton alors que le premier clic compte?

Remarque: La désactivation du bouton dans la première instruction du gestionnaire de clic, puis sa réactivation à la fin ne fonctionne pas. De plus, le désabonnement/l'abonnement à l'événement click (le - = suivi de + =) ne fonctionne pas.

Voici un échantillon pour illustrer:

private bool runningExclusiveProcess = false; 

    private void button1_Click(object sender, EventArgs e) 
    { 
     this.button1.Click -= new System.EventHandler(this.button1_Click); 

     if (!runningExclusiveProcess) 
     { 
      runningExclusiveProcess = true; 
      button1.Enabled = false; 


      textBox1.Clear(); 
      for (int i = 0; i < 1000; i++) 
      { 
       textBox1.AppendText(i + Environment.NewLine); 
      } 


       runningExclusiveProcess = false; 
      button1.Enabled = true; 
     } 

     this.button1.Click += new System.EventHandler(this.button1_Click); 
} 
+0

Vous effectuez tout le travail sur le thread de l'interface utilisateur. Il atteindra toujours la fin de cette méthode avant de vous permettre de cliquer à nouveau sur le bouton. Le code prend probablement beaucoup moins de temps à courir que vous ne le pensez. – xyz

+0

Compter jusqu'à 1000 n'est pas le délai qu'il était. Votre ordinateur compte jusqu'à 1000 entre les clics. (Quelques Sleep() ou d'autres appels de fonction plus longs afficheraient le comportement que vous attendez) –

+0

@tzup Vous avez raison sur les clics mis en file d'attente même si le thread de l'interface utilisateur est bloqué. Je ne le savais pas. Va supprimer ma réponse :) – xyz

Répondre

2

bouton Juste désactiver après clic initial, exécutez une minuterie pour une seconde qui tourne au ralenti réactivez le bouton et se désactiver

+0

Cela fonctionne! Vous voulez expliquer un peu pourquoi? – tzup

0
private bool HasBeenClicked = false; 

private void button1_Click(object sender, EventArgs e) 
    { 
     if(HasBeenClicked) 
      Application.DoEvents(); 
     else { 
      HasBeenClicked = true; 
      // Perform some actions here... 
      } 
    } 

Ce oughta faire il. : O)

2
extrait

Code ici:

public partial class Form1: Formulaire { public int Count {get; ensemble; }

public Form1() 
    { 
     InitializeComponent(); 

     this.Count = 0; 
    } 

    private void GOBtn_Click(object sender, EventArgs e) 
    { 
     this.GOBtn.Enabled = false; 

     this.Increment(); 

     this.GOBtn.Enabled = true; 
    } 

    public void Increment() 
    { 
     this.Count++; 
     this.CountTxtBox.Text = this.Count.ToString(); 
     this.CountTxtBox.Refresh(); 

     Thread.Sleep(5000); //long process 

    } 
} 
Questions connexes