2010-02-16 21 views
9

Ho scritto un programma WinForms in C# .Net per fare clic su un pulsante a livello di codice all'interno di un modulo di password.Il pulsante programmatico fa scattare l'eccezione 'System.StackOverflowException'

Form1 carica e mostra Form2 come finestra di dialogo.

L'applicazione si chiuderà se DialogResult è altro che DialogResult.OK.

Finora ho un evento click del pulsante, che è codificato 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 

Sono non so cosa stia causando questa eccezione.

+0

dimenticato di aggiungere, questo codice si trova all'interno del tasto che si sta cercando di simulare – Crazyd22

+0

Puoi pubblicare un po 'di più su ciò che si sta cercando di fare? In sostanza sembra che tu stia affrontando il problema nel modo sbagliato, quindi il tuo problema. Potrebbe essere in grado di suggerire un modo migliore se sappiamo cosa stai cercando di fare. – Ian

risposta

7

Modifica Non immagino. Dire al pulsante di fare clic su se stesso da se stesso sta sicuramente causando un ciclo infinito. Questo fa sì che il metodo venga chiamato ripetutamente, riempiendo lo stack e causandone l'overflow.

La mia ipotesi è che chiamare il PerformClick() stia causando di nuovo il metodo corrente che è stato postato, causando così un ciclo di chiamata infinito e risultante in uno 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. È possibile ottenere questo risultato impostando txtpass.Text = "" giusto prima di fare in modo che faccia nuovamente clic su di esso.

+0

Ah capisco, qualche idea su come aggirare questo? – Crazyd22

+0

"Probabilmente è possibile ottenere ciò impostando txtpass.Text =" "proprio prima che tu possa fare di nuovo clic su se stesso." Ma allora verrà lanciata la finestra di messaggio "password non valida", quindi qual è il punto? –

+0

Ci provo grazie – Crazyd22

1

Per chiamare il gestore di eventi ancora una volta 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; 

} 
+0

Questo perché ho bisogno di impostare il pulsante di dialogo, ma non voglio farlo senza aver inserito la password, ma questo significa che devono cliccarci due volte – Crazyd22

3

Normalmente si dovrebbe chiamare manualmente l'evento che si sta tentando di eseguire.

E.g. 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()); 

Penso che forse è necessario spiegare un po 'di logica nel codice anche se, come non è chiaro quello che si' sto cercando di fare. StackOverflow probabilmente perché stai facendo

PerformClick() -> PerformClick() -> PerformClick() perché il testo "1234" non cambia mai tra le chiamate.

+0

Ciò causerebbe anche un ciclo infinito se viene chiamato da Button1_Click . –

+0

Andy, sì lo so, era solo la prima parte della mia risposta ... Grazie :) – Ian

+0

Svantaggi di rispondere a un post in alcune fasi ... – Ian

1

PerformClick() all'interno dell'evento click del pulsante? Se è così, è lì che stai andando male perché stai lanciando la tua applicazione in un ciclo infinito. tasto scatta

utente,
.NET gestisce Click() handler,
Button scatta PerformClick(),
.corre NET Click) gestore (,
Button scatta PerformClick(),
.NET gestisce Click() handler,
Button scatta PerformClick(),

ecc

È form1 sicuramente chiamando ShowDialog() su form2, e non solo Show()?

Invece di radButton1.DialogResult, provare a impostare this.DialogResult == DialogResult.OK.

La DialogResult proprietà su un pulsante dice NET che DialogResult da assegnare al Form quando il Button viene cliccato.

+0

Grazie, ma ho risolto il problema – Crazyd22

0

Un sovraccarico di stack si verifica in genere perché il metodo si chiama in modo indefinito, poiché ogni volta che viene chiamato un metodo, una voce viene aggiunta allo stack nel punto in cui non vi è più alcuna pila rimasta.

Per fermare la ricorsione, rimuovere la riga radButton1.PerformClick();

Problemi correlati