程序化按钮单击会抛出’System.StackOverflowException’exception

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

我不确定导致此exception的原因是什么。

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

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

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

 if (txtpass.Text == "1234") 

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

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

例如,如果你有一个方法

 button1_Click(object sender, ButtonEventArgs e) { } 

然后,您将在代码中调用以下内容:

 button1_Click(this, new ButtonEventArgs()); 

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

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

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

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

等等

form1肯定是在form2上调用ShowDialog()而不仅仅是Show()吗?

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

按钮上的DialogResult属性告诉.NET单击Button时哪个DialogResult分配给Form

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

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

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

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