2010-02-16 2 views
9

Я написал программу WinForms в C# .Net, чтобы щелкнуть кнопку программно в форме пароля.Программная кнопка click throws Исключение System.StackOverflowException

Form1 загружает и показывает Form2 в качестве диалогового окна.

Приложение закрывается, если DialogResult - это что-то другое, что DialogResult.OK.

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

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 

Я не знаете, что вызывает это исключение.

+0

Забыл добавить, что этот код внутри кнопки, что она пытается имитировать – Crazyd22

+0

Вы можете разместить несколько больше о том, что вы пытаетесь сделать? По сути, похоже, что вы пытаетесь устранить проблему неправильно, следовательно, ваша проблема. Мог бы предложить лучший способ, если мы знаем, что вы пытаетесь сделать. – Ian

ответ

7

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

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

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

if (txtpass.Text == "1234") 

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

+0

А я вижу, какие-нибудь идеи о том, как обойти это? – Crazyd22

+0

«Возможно, вы можете достичь этого, установив txtpass.Text =« »прямо перед тем, как заставить его снова щелкнуть. Но тогда это выведет окно с недопустимым паролем - так в чем смысл? –

+0

Я дам это спасибо – Crazyd22

1

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

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

     txtpass.Text = "12345"; 

     radButton1.PerformClick(); 

     break; 

    default: 
     case "12345": 
     break; 

} 
+0

Это потому, что мне нужно установить кнопку диалога вверх, но я не хочу этого делать без ввода пароля, но это означает, что они должны дважды щелкнуть по нему. – Crazyd22

3

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

E.g. если у вас есть метод

button1_Click(object sender, ButtonEventArgs e) 
{ 
} 

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

button1_Click(this, new ButtonEventArgs()); 

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

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

+0

Это также вызовет бесконечный цикл, если он вызван из Button1_Click , –

+0

Andy, да, я знаю, это была только первая часть моего ответа ... Спасибо :) – Ian

+0

Недостатки ответа на сообщение в несколько этапов ... – Ian

1

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

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

т.д.

Является form1 определенно вызывая ShowDialog() на form2, а не только Show()?

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

DialogResult свойство на кнопке сообщает .NET, которая DialogResult присваиваемое Form, когда Button нажата.

+0

Спасибо, но я разобрал проблему – Crazyd22

0

Переполнение стека происходит обычно потому, что метод бесконечно вызывает себя, потому что каждый раз, когда вызывается метод, запись добавляется в стек до точки, где осталось больше стека.

Чтобы остановить рекурсию, удалить строку radButton1.PerformClick();

 Смежные вопросы

  • Нет связанных вопросов^_^