Я записал программу 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
Я не уверен, что заставляет это исключение бросать.
Править Не догадка. Указание кнопке щелкнуть саму себя изнутри, безусловно, вызывает бесконечный цикл. Это приводит к тому, что метод вызывается снова и снова, заполняя стек и вызывая его переполнение.
Я предполагаю, что вызов PerformClick ()
вызывает повторный вызов опубликованного вами метода, что вызывает бесконечный цикл вызовов и приводит к исключению StackOverflowException
.
Чтобы предотвратить это, вам нужно где-то в коде исправить логику, чтобы:
if (txtpass.Text == "1234")
оценивалось как false
, и метод щелчка не вызывался снова и снова. Вероятно, вы можете добиться этого, установив txtpass.Text = ""
прямо перед тем, как заставить его снова щелкнуть себя.
Обычно вы вручную вызываете событие, которое пытаетесь запустить.
Например, если у вас есть метод
button1_Click(object sender, ButtonEventArgs e)
{
}
Тогда вы должны вызвать следующее в вашем коде:
button1_Click(this, new ButtonEventArgs());
Я думаю, что вам нужно объяснить некоторую логику в вашем коде, так как не ясно, что вы пытаетесь сделать. StackOverflow, вероятно, потому что вы делаете
PerformClick() -> PerformClick() -> PerformClick(), потому что ваш текст "1234" никогда не меняется между вызовами.
Выполняется ли 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
.
Чтобы снова вызвать обработчик событий изнутри, вы можете использовать следующий код:
if (txtpass.Text)
{
case "1234":
radButton1.DialogResult = DialogResult.OK;
txtpass.Text = "12345";
radButton1.PerformClick();
break;
default:
case "12345":
break;
}