Pulsante Programmatico clic getta eccezione 'System.StackOverflowException'
-
20-09-2019 - |
Domanda
Ho scritto un programma di WinForms in C # .NET per fare clic su un pulsante di programmazione all'interno di un modulo password.
carichi Form1
e mostra Form2
come una finestra di dialogo.
L'applicazione si chiuderà se DialogResult è qualcosa di diverso che DialogResult.OK.
Finora ho un evento click del pulsante, che è codificata come segue:
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();
}
}
Io uso radButton1.PerformClick();
, ma in esecuzione il programma mi dà il seguente messaggio:
An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll
Non sono sicuro che cosa sta causando questa eccezione per gettare.
Soluzione
Modifica Non una supposizione. Raccontare il pulsante per fare clic se stesso da dentro di sé è sicuramente causando un ciclo infinito. Questo fa sì che il metodo per ottenere chiamato ripetutamente, riempiendo lo stack e facendolo traboccare.
La mia ipotesi è che la chiamata PerformClick()
è la causa del metodo attuale che avete inviato per ottenere ancora una volta chiamato, provocando in tal modo un ciclo infinito e chiamata con un conseguente StackOverflowException
.
Per evitare questo, è necessario fissare la logica da qualche parte nel codice in modo che:
if (txtpass.Text == "1234")
viene valutato come false
e il metodo di scatto non viene chiamato più e più volte. Probabilmente si può raggiungere questo impostando txtpass.Text = ""
destra prima di causare a fare clic su se stessa di nuovo.
Altri suggerimenti
Normalmente si dovrebbe chiamare manualmente l'evento che si sta tentando di eseguire.
es. se si dispone di un metodo
button1_Click(object sender, ButtonEventArgs e)
{
}
Poi si dovrebbe chiamare il seguente nel codice:
button1_Click(this, new ButtonEventArgs());
Credo che forse è necessario spiegare un po 'di logica nel codice anche se, come non è chiaro quello che stai cercando di fare. Lo StackOverflow probabilmente perché si sta facendo
PerformClick () -> PerformClick () -.> PerformClick () perché il tuo "1234" il testo non cambia mai tra le chiamate
È il PerformClick()
all'interno evento click del pulsante? Se è così, questo è dove si sta andando male perché si sta gettando la vostra applicazione in un ciclo infinito.
utente fa clic sul pulsante,
.NET gestisce Clicca handler (),
Button scatta PerformClick()
,
.NET gestisce Clicca handler (),
Button scatta PerformClick()
,
.NET gestisce Clicca handler (),
clic sui pulsanti PerformClick()
,
ecc.
È form1
sicuramente chiamando ShowDialog()
su form2
, e non solo Show()
?
Invece di radButton1.DialogResult
, provare a impostare this.DialogResult == DialogResult.OK
.
La proprietà DialogResult
su un pulsante dice a NET che DialogResult
assegnare al Form
quando il Button
viene cliccato.
Per richiamare il gestore di eventi da dentro è possibile utilizzare il seguente codice:
if (txtpass.Text)
{
case "1234":
radButton1.DialogResult = DialogResult.OK;
txtpass.Text = "12345";
radButton1.PerformClick();
break;
default:
case "12345":
break;
}
Un overflow dello stack di solito accade perché il metodo è a tempo indeterminato che si fa chiamare, perché ogni volta che un metodo viene chiamato, viene aggiunta una voce alla pila al punto in cui non c'è più stack di sinistra.
Per fermare la ricorsione, rimuovere la radButton1.PerformClick();
riga