C# 编程按钮点击抛出';System.StackOverflowException';例外

C# 编程按钮点击抛出';System.StackOverflowException';例外,c#,button,click,stack-overflow,simulate,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", Message

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

我不确定引发此异常的原因。

编辑不是猜测。告诉按钮从其内部单击它自己,这无疑会导致一个无限循环。这会导致反复调用该方法,填满堆栈并导致其溢出

我猜调用
PerformClick()
会导致您发布的当前方法再次被调用,从而导致无限调用循环,并导致
堆栈溢出异常

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

if (txtpass.Text == "1234")

计算结果为
false
,并且不会反复调用click方法。您可以通过在再次单击事件处理程序之前设置
txtpass.Text=”“
来实现此目的。

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

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

        txtpass.Text = "12345";

        radButton1.PerformClick();

        break;

    default:
        case "12345":
        break;

}

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

例如,如果你有一个方法

button1_Click(object sender, ButtonEventArgs e)
{
}
然后在代码中调用以下命令:

button1_Click(this, new ButtonEventArgs());
我想也许你需要在你的代码中解释一些逻辑,因为不清楚你想做什么。堆栈溢出可能是因为您正在执行

PerformClick()->PerformClick()->PerformClick(),因为您的“1234”文本在调用之间从不更改。

按钮的单击事件中是否包含
PerformClick()
?如果是这样,那就是你出错的地方,因为你把你的应用程序扔进了一个无限循环

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

等等

form1
是否明确地在
form2
上调用
ShowDialog()
,而不仅仅是
Show()

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


按钮上的
DialogResult
属性告诉.NET当单击
按钮时,要将哪个
DialogResult
分配给
表单。

堆栈溢出通常发生,因为方法无限期地调用自身,因为每次调用一个方法,一个条目被添加到堆栈中,直到不再剩下堆栈


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

忘记添加了,该代码在它试图模拟的按钮内。您可以发布更多关于您尝试执行的操作的信息吗?从本质上看,你似乎在以错误的方式处理问题,因此你的问题。如果我们知道你想做什么,也许可以建议一个更好的方法。啊,我明白了,关于如何解决这个问题,有什么想法吗?“你可以在让它再次点击之前设置txtpass.Text=”“。但是这样会抛出“无效密码”消息框-那有什么意义呢?@Andy我明白了,按钮中的逻辑似乎需要修改很多。如果从按钮内部调用,这也会导致无限循环。安迪,是的,我知道,这只是我回答的第一部分。。。谢谢:)这是因为我需要设置对话按钮,但我不想在他们没有输入密码的情况下这样做,但这意味着他们必须单击两次谢谢,但我已经解决了问题