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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top