Программное нажатие кнопки бросает 'Систему. StackOverflowException' исключение

Я записал программу WinForms в C#.Net для нажатия кнопки программно в форме пароля.

Form1 загрузки и шоу Form2 как диалоговое окно.

Приложение закроется, если DialogResult будет чем-нибудь другой тот DialogResult. Хорошо.

До сих пор у меня есть событие нажатия кнопки, которое кодируется следующим образом:

 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();
                }
            }

Я использую radButton1.PerformClick();, но запущение программы дает мне следующее сообщение:

An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll

Я не уверен, что заставляет это исключение бросать.

9
задан Knickerless-Noggins 23 June 2017 в 09:46
поделиться

4 ответа

Править Не догадка. Указание кнопке щелкнуть саму себя изнутри, безусловно, вызывает бесконечный цикл. Это приводит к тому, что метод вызывается снова и снова, заполняя стек и вызывая его переполнение.

Я предполагаю, что вызов PerformClick () вызывает повторный вызов опубликованного вами метода, что вызывает бесконечный цикл вызовов и приводит к исключению StackOverflowException .

Чтобы предотвратить это, вам нужно где-то в коде исправить логику, чтобы:

if (txtpass.Text == "1234")

оценивалось как false , и метод щелчка не вызывался снова и снова. Вероятно, вы можете добиться этого, установив txtpass.Text = "" прямо перед тем, как заставить его снова щелкнуть себя.

7
ответ дан 4 December 2019 в 19:33
поделиться

Обычно вы вручную вызываете событие, которое пытаетесь запустить.

Например, если у вас есть метод

button1_Click(object sender, ButtonEventArgs e)
{
}

Тогда вы должны вызвать следующее в вашем коде:

button1_Click(this, new ButtonEventArgs());

Я думаю, что вам нужно объяснить некоторую логику в вашем коде, так как не ясно, что вы пытаетесь сделать. StackOverflow, вероятно, потому что вы делаете

PerformClick() -> PerformClick() -> PerformClick(), потому что ваш текст "1234" никогда не меняется между вызовами.

3
ответ дан 4 December 2019 в 19:33
поделиться

Выполняется ли PerformClick() внутри события click кнопки? Если да, то именно здесь вы ошибаетесь, поскольку бросаете свое приложение в бесконечный цикл.

Пользователь нажимает кнопку,
.NET запускает обработчик Click(),
Кнопка нажимается PerformClick(),
.NET запускает обработчик Click(),
Нажатие кнопки PerformClick(),
.NET запускает обработчик Click(),
Нажатие кнопки PerformClick(),

и т.д.

Точно ли form1 вызывает ShowDialog() на form2, а не просто Show()?

Вместо radButton1.DialogResult попробуйте установить this.DialogResult == DialogResult.OK.

Свойство DialogResult кнопки указывает .NET, какой DialogResult назначить Form при нажатии Button.

1
ответ дан 4 December 2019 в 19:33
поделиться

Чтобы снова вызвать обработчик событий изнутри, вы можете использовать следующий код:

if (txtpass.Text)
{
    case "1234":
        radButton1.DialogResult = DialogResult.OK;

        txtpass.Text = "12345";

        radButton1.PerformClick();

        break;

    default:
        case "12345":
        break;

}
1
ответ дан 4 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: