winforms - 暂时禁用按钮

标签 winforms button

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

我的表格上只有一个按钮。该按钮调用一个函数,该函数需要 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/

相关文章:

c# - 如何将搜索引擎添加到 GeckoFx 网络浏览器?

java - Google App Maker - 单击按钮从文本框读取并汇总到标签

excel - 如何删除excel中大量命令按钮

c# - Windows 窗体应用程序中不同线程中的 GUI 和逻辑分离

c# - 带参数调用委托(delegate)方法名

c# - 如何查找 Windows 窗体面板中是否存在标签

html - 如何使用 flexbox 在中心底部对齐元素

android - 以编程方式创建按钮或在 xml 中创建按钮之间是否存在性能差异?

javascript - 将自己的 .innerHTML 文本内容复制到剪贴板的 HTML 按钮

c# - 验证或验证事件?