9

我在 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

我不确定是什么导致这个异常抛出。

4

5 回答 5

7

编辑不是猜测。告诉按钮从自身内部单击自身肯定会导致无限循环。这会导致该方法被一遍又一遍地调用,填满堆栈并导致它溢出。

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

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

if (txtpass.Text == "1234")

计算结果为false并且 click 方法不会被一遍又一遍地调用。您可以通过txtpass.Text = ""在使其再次单击之前进行设置来实现此目的。

于 2010-02-16T09:52:29.777 回答
3

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

例如,如果你有一个方法

button1_Click(object sender, ButtonEventArgs e)
{
}

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

button1_Click(this, new ButtonEventArgs());

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

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

于 2010-02-16T09:54:28.413 回答
1

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

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

        txtpass.Text = "12345";

        radButton1.PerformClick();

        break;

    default:
        case "12345":
        break;

}
于 2010-02-16T09:54:11.130 回答
1

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

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

等等

是绝对在form1呼唤,而不仅仅是?ShowDialog()form2Show()

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

按钮上的DialogResult属性告诉 .NET在单击 时DialogResult分配给。FormButton

于 2010-02-16T09:55:08.053 回答
0

堆栈溢出通常是因为方法无限期地调用自身,因为每次调用方法时,都会将一个条目添加到堆栈中,直到没有剩余堆栈为止。

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

于 2017-06-19T07:10:24.853 回答