C# 编程按钮点击抛出';System.StackOverflowException';例外
我在C#.Net中编写了一个WinForms程序,以编程方式单击密码表单中的按钮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
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我明白了,按钮中的逻辑似乎需要修改很多。如果从按钮内部调用,这也会导致无限循环。安迪,是的,我知道,这只是我回答的第一部分。。。谢谢:)这是因为我需要设置对话按钮,但我不想在他们没有输入密码的情况下这样做,但这意味着他们必须单击两次谢谢,但我已经解决了问题