Programmatic button click throws 'System.StackOverflowException' exception

蓝咒 提交于 2019-12-05 20:18:02

问题


I have written a WinForms program in C#.Net to click a button programmatically within a password form.

Form1 loads and shows Form2 as a dialogue box.

The application will close if DialogResult is anything other that DialogResult.OK.

So far I have a button click event, which is coded as follows:

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

I use radButton1.PerformClick();, but running the program gives me the following message:

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

I'm unsure what is causing this exception to throw.


回答1:


Edit Not a guess. Telling the button to click itself from within itself is most definitely causing an infinite loop. This causes the method to get called over and over, filling up the stack and causing it to overflow.

My guess is that calling PerformClick() is causing the current method you posted to get called again, thus causing an infinite call loop and resulting in a StackOverflowException.

To prevent this, you need to fix the logic somewhere in your code so that:

if (txtpass.Text == "1234")

evaluates to false and the click method doesn't get called over and over. You can probably achieve this by setting txtpass.Text = "" right before you cause it to click itself again.




回答2:


Normally you would manually call the event that you are trying to run.

E.g. if you have a method

button1_Click(object sender, ButtonEventArgs e)
{
}

Then you would call the following in your code:

button1_Click(this, new ButtonEventArgs());

I think maybe you need to explain some logic in your code though, as it's not clear what you're trying to do. The StackOverflow probably because you're doing

PerformClick() -> PerformClick() -> PerformClick() because your "1234" text never changes between calls.




回答3:


Is the PerformClick() inside the button's click event? If so, that's where you're going wrong because you're throwing your application into an infinite loop.

User clicks button,
.NET runs Click() handler,
Button clicks PerformClick(),
.NET runs Click() handler,
Button clicks PerformClick(),
.NET runs Click() handler,
Button clicks PerformClick(),

etc.

Is form1 definitely calling ShowDialog() on form2, and not just Show()?

Instead of radButton1.DialogResult, try setting this.DialogResult == DialogResult.OK.

The DialogResult property on a button tells .NET which DialogResult to assign to the Form when the Button is clicked.




回答4:


To call the event handler again from inside you could use the following code:

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

        txtpass.Text = "12345";

        radButton1.PerformClick();

        break;

    default:
        case "12345":
        break;

}



回答5:


A stack overflow happens usually because method is indefinitely calling itself, because each time a method is called, an entry is added to the stack to the point where there is no more stack left.

To stop the recursion, remove the line radButton1.PerformClick();



来源:https://stackoverflow.com/questions/2271883/programmatic-button-click-throws-system-stackoverflowexception-exception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!