gpt4 book ai didi

winforms - 暂时禁用按钮

转载 作者:行者123 更新时间:2023-11-30 23:51:39 25 4
gpt4 key购买 nike

应该很简单,但是... :)

我的表格上只有一个按钮。该按钮调用一个函数,该函数需要 10 秒才能执行(例如)。我想在此期间暂时禁用该按钮,以便如果用户在执行该功能时按下 Enter 键,则不会发生任何事情。

但现在它是这样工作的:用户按下 Enter 键,按钮被禁用。在这 10 秒内,用户再次按下 Enter 键,当第一个函数完成时,它再次被调用。我想防止这种情况发生,因此 Enter 键仅在按钮再次启用时才起作用。一切都在同一个线程中。

我的代码:

private void button1_Click(object sender, EventArgs e)
{
Debug.WriteLine("Click");
button1.Enabled = false;
Thread.Sleep(3000); // simulate something...
button1.Enabled = true;
button1.Focus();
}

编辑:该功能在打印机上打印一些东西。通过打印机的 API 函数,我可以确定打印何时完成,然后才能再次启用该按钮。

最佳答案

我最近遇到了同样的问题,我决定发布我的解释:

在执行冗长的任务时,用户多次单击按钮。 Windows 将这些消息发送给应用程序,但是应用程序无法立即处理它们,因为它此时正忙。因此消息在队列中等待应用程序变得可用。当应用程序完成任务时,按钮的 Enabled 属性立即设置为 True,接下来发生的事情是,它接收排队的消息。此时按钮已启用,因此应用程序处理新的点击,就好像该按钮从未被禁用一样。

修复建议:

您可以在“button1.Enabled = true;”行之前插入“Application.DoEvents()”行这样,排队的消息将在按钮仍处于禁用状态时到达该按钮,并且该按钮现在将丢弃它们。

免责声明:似乎 Application.DoEvents() 的使用不被认为是一种好的做法。然而,它很好地显示了在这种特殊情况下会发生什么。

我认为 Rhapsody 建议的解决方案比使用 Application.DoEvents() 更好。使用 BackgroundWorker,我们正在创建第二个线程,因此我们不会阻塞 GUI 线程。由于 GUI 保持响应,禁用按钮将按预期工作。

关于winforms - 暂时禁用按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5580113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com