0 votes

C# Comment faire : Essayer d'appeler un bouton deux fois dans la même classe ?

J'ai fait quelques recherches ici et sur le net et je n'ai pas encore trouvé de bonne réponse. Ce que j'essaie de faire, c'est d'appeler un bouton deux fois dans la même classe en C#.

Voici mon scénario -

J'ai un formulaire avec un bouton qui dit "Go". Lorsque je clique dessus la première fois, il passe par des boucles 'for' (sans arrêt) pour afficher une gamme de couleurs. En même temps, je règle les propriétés de button1.Text sur "Stop". Je voudrais pouvoir cliquer sur le bouton une deuxième fois et, à ce moment-là, je voudrais que le programme s'arrête. En gros, un bouton "stop-and-go". Je sais comment le faire avec deux événements de bouton, mais j'aimerais utiliser un seul bouton.

Actuellement, le seul moyen de mettre fin au programme est le bouton X du formulaire.

J'ai essayé différentes choses et je n'ai pas eu beaucoup de chance jusqu'à présent, alors je voulais demander aux gourous ici comment faire.

BTW, il s'agit d'une modification d'un Labos Head First C# exercice du livre.

Merci !

~Allen

7voto

Cerebrus Points 18045

Vous devrez utiliser le multithreading (lancer le code intensif du processus de manière asynchrone dans un thread séparé), par exemple en utilisant la fonction BackgroundWorker dans .NET 2+. Cela est nécessaire car votre interface utilisateur ne répondra pas au clic de l'utilisateur tant que la boucle exécutée dans la méthode Start ne sera pas terminée. Il importe peu que vous utilisiez le même bouton ou un autre pour basculer le processus, car le processeur est occupé à traiter la boucle.

Le site BackgroundWorker a une propriété appelée WorkerSupportsCancellation qui doit être vrai dans ce scénario. Lorsque l'utilisateur clique sur Stop, vous invoquez la fonction CancelAsync de la méthode BackgroundWorker .

Ver MSDN pour un bon exemple. Aussi DreamInCode a un bon tutoriel qui semble assez similaire à votre besoin.

3voto

Adrian Godong Points 5367

Pourquoi ne pas créer deux boutons, en cacher un lorsque l'autre est visible ? Cela devrait être beaucoup plus facile à gérer.

Vous pouvez également ajouter un champ bool pour indiquer la branche d'opération à exécuter.

3voto

Greg D Points 24218

Une solution simple serait d'ajouter un membre booléen à votre formulaire qui serait, par exemple, true quand le bouton dit "Go" et false quand le bouton dit "Stop".

Ensuite, dans le gestionnaire d'événements de votre bouton, vérifiez cette valeur booléenne. Si la valeur est true puis commencez votre opération et réglez la valeur sur false lorsque vous changez le texte du bouton pour dire "stop". Vice-versa pour l'autre cas :)

Il y a d'autres techniques que je pourrais préférer s'il s'agissait d'un code de production, peut-être en considérant plus attentivement la conception du formulaire, mais comme il s'agit clairement d'un exercice d'apprentissage, je pense qu'un simple indicateur booléen indiquant l'état actuel de l'utilisateur est suffisant. état du formulaire est exactement ce que vous recherchez.

Notez que je vous déconseille fortement de vérifier la valeur du texte du bouton pour déterminer l'état de l'objet. Dans la mesure du possible, en tant que règle générale de bonne conception, vous voulez que votre état visuel soit "découplé" de l'état de votre objet sous-jacent. En d'autres termes, vos widgets visuels peuvent dépendre de vos objets sous-jacents, mais ces derniers ne doivent pas dépendre de vos widgets visuels. Si vous testez le texte du bouton, votre logique sous-jacente dépendrait de votre état visuel et cela violerait cette règle générale.

Si votre problème est lié au fait que vous ne pouvez pas annuler l'opération pendant qu'elle est en cours, vous pouvez envisager d'utiliser une méthode d'annulation de l'opération. Travailleur d'arrière-plan pour effectuer votre activité de longue durée.

1voto

Patrick McDonald Points 20645

Une autre option serait de vérifier le texte actuel de votre bouton pour déterminer ce qu'il faut faire :

void btnStartStop_Click(Object sender, EventArgs e) 
{
    if (btnStartStop.Text == "Go")
    {
        btnStartStop.Text = "Stop";

        // Go code here

    }
    else 
    {
        btnStartStop.Text = "Go";

        // Stop code here

    }
}

1voto

JMarsch Points 9814

Obtenez-vous l'événement de clic du deuxième bouton ? Mettez un point d'arrêt dans votre gestionnaire de clic et exécutez votre code. Lorsque vous cliquez la deuxième fois, est-ce que vous atteignez votre point d'arrêt ?

Si votre boucle s'exécute en continu, et qu'elle se trouve dans le gestionnaire de clics de votre bouton, alors votre boucle s'exécute dans le thread de l'interface utilisateur. Vous ne verrez probablement pas le deuxième clic de bouton avant la fin de la boucle. En plus du code de branche que vous voyez ci-dessus, essayez soit d'insérer un DoEvents dans le traitement de votre boucle (c'est un endroit où votre boucle abandonnera temporairement le contrôle afin que les messages puissent être traités). Ou, (mieux), jetez un coup d'oeil à la classe backgroundworker -- faites la plupart de votre traitement dans un thread différent, de sorte que votre interface utilisateur puisse rester réactive aux clics de bouton.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X