views:

774

answers:

4

Hey, I am trying to make a simulation of a button click for a password form, basically the form1 loads and shows form2 as a dialogue, and if it does not give back DialogResult.OK, then it closes the application.

So far I have in the button:

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

So far as you can see I am trying to use radButton1.PerformClick(); but that gives me the error message:

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

Any ideas?

Thanks.

+4  A: 

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.

jjnguy
Ah I see, any ideas on how to get around this?
Crazyd22
"You can probably achieve this by setting txtpass.Text = "" right before you cause it to click itself again." But then that will throw the "invalid password" message box - so what's the point?
Andy Shellam
I'll give it a go thanks
Crazyd22
@Andy I see that, the logic in the button needs to be reworked a lot it seems.
jjnguy
Perfect, this works thanks!
Crazyd22
@Crazy Good to hear.
jjnguy
A: 

I don't know what you want to achieve exactly and why you'd call the event handler again from inside, but how about:

          if (txtpass.Text == "1234")
            {
                radButton1.DialogResult = DialogResult.OK;
                txtpass.Text = "12345";
                radButton1.PerformClick();
            }

:->

herzmeister der welten
This is because I need to set the dialogue button up, but I dont want to do this without them entering the password, but this means that they have to click it twice
Crazyd22
A: 

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.

Ian
This would also cause an infinite loop if it's called from within Button1_Click.
Andy Shellam
Andy, yeah I know, was just the first part of my answer... Thanks :)
Ian
Disadvantages as to answering a post in a few stages...
Ian
+1  A: 

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.

Andy Shellam
Thanks, but I have sorted the problem
Crazyd22