编程按钮单击引发“System.***Exception”异常

Posted

技术标签:

【中文标题】编程按钮单击引发“System.***Exception”异常【英文标题】:Programmatic button click throws 'System.***Exception' exception 【发布时间】:2011-01-17 07:56:51 【问题描述】:

我在 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.***Exception' occurred in mscorlib.dll

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

【问题讨论】:

忘记添加了,这段代码在它试图模拟的按钮内 你能发布更多关于你想要做什么的信息吗?从本质上讲,您似乎以错误的方式解决问题,因此您的问题。如果我们知道您要做什么,也许可以提出更好的方法。 【参考方案1】:

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

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

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

if (txtpass.Text == "1234")

评估为false,并且不会一遍又一遍地调用 click 方法。您可以通过设置txtpass.Text = "" 来实现这一点,然后再让它再次点击自己。

【讨论】:

啊,我明白了,关于如何解决这个问题的任何想法? "你可以通过设置 txtpass.Text = "" 在你让它再次点击之前实现它。但这会抛出“无效密码”消息框——那有什么意义呢? @Andy 我明白了,按钮中的逻辑似乎需要重做很多。【参考方案2】:

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

例如如果你有方法

button1_Click(object sender, ButtonEventArgs e)


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

button1_Click(this, new ButtonEventArgs());

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

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

【讨论】:

如果从 Button1_Click 中调用,也会导致无限循环。 安迪,是的,我知道,这只是我回答的第一部分......谢谢:)【参考方案3】:

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

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

等等

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

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

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

【讨论】:

谢谢,问题已经解决了【参考方案4】:

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

if (txtpass.Text)

    case "1234":
        radButton1.DialogResult = DialogResult.OK;

        txtpass.Text = "12345";

        radButton1.PerformClick();

        break;

    default:
        case "12345":
        break;


【讨论】:

这是因为我需要设置对话按钮,但我不想在没有他们输入密码的情况下这样做,但这意味着他们必须点击两次【参考方案5】:

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

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

【讨论】:

以上是关于编程按钮单击引发“System.***Exception”异常的主要内容,如果未能解决你的问题,请参考以下文章

ignite-native-base-boilerplate - 单击 LaunchScreen 上的探索按钮会引发错误 - Android

按钮单击在后续启动时会出现不同的错误

在按钮单击时显示/隐藏 ImageView

如何以编程方式单击 WPF 中的按钮?

jquery手风琴内的asp按钮不引发服务器事件

如何从用户控件中引发自定义路由事件?