程序化按钮单击会抛出'System.StackOverflowException'异常

时间:2010-02-16 09:50:14

标签: c# button click stack-overflow simulate

我已经在C#.Net中编写了一个WinForms程序,以便在密码表单中以编程方式单击按钮。

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

我不确定导致此异常的原因。

5 个答案:

答案 0 :(得分:7)

修改不是猜测。告诉按钮从内部单击它本身肯定会导致无限循环。这会导致方法被反复调用,填满堆栈并使其溢出。

我的猜测是调用PerformClick()会导致您发布的当前方法再次被调用,从而导致无限的调用循环并导致StackOverflowException

为了防止这种情况,您需要在代码中的某处修复逻辑,以便:

if (txtpass.Text == "1234")

评估为false,并且不会一遍又一遍地调用click方法。您可以通过在使txtpass.Text = ""再次单击之前设置{{1}}来实现此目的。

答案 1 :(得分:3)

通常您会手动调用您尝试运行的事件。

E.g。如果你有方法

button1_Click(object sender, ButtonEventArgs e)
{
}

然后你会在你的代码中调用以下内容:

button1_Click(this, new ButtonEventArgs());

我想也许你需要在你的代码中解释一些逻辑,因为你不清楚你想要做什么。 StackOverflow可能是因为你正在做

PerformClick() - > PerformClick() - > PerformClick()因为“1234”文本在调用之间永远不会改变。

答案 2 :(得分:1)

要从内部再次调用事件处理程序,可以使用以下代码:

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

        txtpass.Text = "12345";

        radButton1.PerformClick();

        break;

    default:
        case "12345":
        break;

}

答案 3 :(得分:1)

按钮的点击事件中有PerformClick()吗?如果是这样,那就是你出错了,因为你把你的应用程序扔进了无限循环。

用户点击按钮,
.NET运行Click()处理程序,
按钮点击PerformClick()
.NET运行Click()处理程序,
按钮点击PerformClick()
.NET运行Click()处理程序,
按钮点击PerformClick()

form1肯定是ShowDialog()上的form2,而不只是Show()

而不是radButton1.DialogResult,请尝试设置this.DialogResult == DialogResult.OK

按钮上的DialogResult属性告诉.NET在DialogResult被点击时Form分配给Button

答案 4 :(得分:0)

堆栈溢出通常是因为方法无限期地调用自身,因为每次调用一个方法时,都会向堆栈添加一个条目,使其不再有堆栈。

要停止递归,请删除第radButton1.PerformClick();