Programmatique cliquez sur le bouton déclenche le Système de la.StackOverflowException' exception
J'ai écrit un programme en WinForms C#.Net cliquez sur un bouton par programme à l'intérieur d'un formulaire de mot de passe.
Form1
charges et montre Form2
comme une boîte de dialogue.
De fermeture de l'application si DialogResult est rien d'autre que DialogResult.OK.
Pour l'instant j'ai un clic sur un bouton de l'événement, qui est codé comme suit:
if (txtpass.Text == "")
{
MessageBox.Show("You need to enter a password", "Password", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
txtpass.Focus();
}
else
{
if (txtpass.Text == "1234")
{
radButton1.DialogResult = DialogResult.OK;
radButton1.PerformClick();
}
else
{
MessageBox.Show("Password Incorrect", "Password", MessageBoxButtons.OK, MessageBoxIcon.Error);
txtpass.Text = "";
txtpass.Focus();
}
}
- Je utiliser radButton1.PerformClick();
, mais l'exécution de ce programme me donne le message suivant:
An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll
Je ne suis pas sûr ce qui est à l'origine de cette exception à jeter.
Oublié d'ajouter, ce code est à l'intérieur du bouton, qu'il essaie de simuler
Pouvez-vous poster un peu plus à propos de ce que vous essayez de faire? Essentiellement, il semble que vous êtes la clouant le problème dans le mauvais sens, donc votre problème. Peut-être en mesure de proposer une meilleure façon, si nous savons ce que vous essayez de faire.
Pouvez-vous poster un peu plus à propos de ce que vous essayez de faire? Essentiellement, il semble que vous êtes la clouant le problème dans le mauvais sens, donc votre problème. Peut-être en mesure de proposer une meilleure façon, si nous savons ce que vous essayez de faire.
OriginalL'auteur Crazyd22 | 2010-02-16
Vous devez vous connecter pour publier un commentaire.
Modifier Pas une supposition. Raconter le bouton à cliquer-même de l'intérieur lui-même est très certainement provoquer une boucle infinie. Cela provoque la méthode pour obtenir de l'appelé, le remplissage de la pile et à l'origine de débordement.
Ma conjecture est que l'appel à
PerformClick()
est à l'origine de la méthode actuelle que vous avez posté à être appelé de nouveau, provoquant ainsi une infinie appel de la boucle et résultant en unStackOverflowException
.Pour éviter cela, vous devez corriger la logique quelque part dans votre code, de sorte que:
évalue à
false
et la méthode de clic n'est pas appelée à plusieurs reprises. Vous pouvez probablement obtenir ce par la mise entxtpass.Text = ""
droite avant de vous provoquer sur lui-même à nouveau."Vous pouvez probablement obtenir ce par la mise en txtpass.Texte = "" juste avant de le provoquer sur lui-même à nouveau." Mais alors qui va jeter le "mot de passe invalide" boîte de message - alors, quel est le point?
Je vais lui donner un aller merci
Je vois que, la logique du bouton doit être retravaillé beaucoup il me semble.
Parfait, cela fonctionne merci!
OriginalL'auteur jjnguy
Normalement vous le feriez manuellement à l'appel de l'événement que vous voulez exécuter.
E. g. si vous avez une méthode
Ensuite, vous devez appeler la ligne suivante dans votre code:
Je pense que peut-être vous avez besoin d'expliquer une certaine logique dans votre code si, comme il n'est pas clair ce que vous essayez de faire. Le StackOverflow probablement parce que vous êtes en train de faire
PerformClick() -> PerformClick() -> PerformClick() parce que votre "1234" le texte ne change pas entre les appels.
Andy, oui, je sais, c'était juste la première partie de ma réponse... Merci 🙂
Les inconvénients de répondre à un post dans quelques étapes...
OriginalL'auteur Ian
Est le
PerformClick()
à l'intérieur de l'événement click du bouton? Si oui, c'est là que vous allez tort parce que vous lancez votre application dans une boucle infinie.Utilisateur clique sur le bouton,
.NET s'exécute Sur (la) gestionnaire,
Clics de bouton
PerformClick()
,.NET s'exécute Sur (la) gestionnaire,
Clics de bouton
PerformClick()
,.NET s'exécute Sur (la) gestionnaire,
Clics de bouton
PerformClick()
,etc.
Est
form1
certainement appelShowDialog()
surform2
, et pas seulementShow()
?Au lieu de
radButton1.DialogResult
, essayez de définirthis.DialogResult == DialogResult.OK
.La
DialogResult
propriété sur un bouton dit .NET quiDialogResult
à affecter à laForm
lorsque leButton
est cliqué.OriginalL'auteur Andy Shellam
Pour appeler le gestionnaire d'événement nouveau de l'intérieur, vous pouvez utiliser le code suivant:
OriginalL'auteur herzmeister
Un débordement de pile se produit généralement parce que la méthode est indéfiniment appelant elle-même, parce que chaque fois qu'une méthode est appelée, une entrée est ajoutée à la pile au point où il n'y a plus de pile de gauche.
D'arrêt de la récursivité, supprimer la ligne
radButton1.PerformClick();
OriginalL'auteur Knickerless-Noggins