2

我试图阻止用户在通过初始单击启动数据后处理数据时多次单击按钮。

简单地禁用按钮 ( buttonBackupNow.Enabled = false;) 并没有帮助,因为如果用户多次单击按钮,即使按钮被禁用,表单也会像之前的数据处理例程一样注册单击并重新开始数据处理。

我尝试使按钮不可见,结果仍然相同。再次尝试禁用表单,结果相同。所以我认为唯一的解决方案是在处理数据时完全忽略点击。

那么,如何阻止表单接收用户鼠标点击?

编辑:此问题与我在数据处理完成后尝试重新启用按钮的事实有关。

4

6 回答 6

4

简单地禁用按钮 (buttonBackupNow.Enabled = false;) 并没有帮助,因为如果用户多次单击按钮,即使按钮被禁用,表单也会注册单击并在前一个数据处理例程完成后立即重新开始数据处理.

真的吗?你是怎么做到的?我根本无法重现它。禁用按钮会阻止Click触发事件。

这本身就足够了。您不必解除事件(以及使用其他技巧)。如果您需要求助于它,则其他地方可能不正确(也许某些代码正在重新启用该按钮?)。

事实上,即使删除处理程序对您也无济于事 - 正如您自己在回应Justin Harvey's answer 时所说的那样 - 让我确信问题出在其他地方。


PS。从用户体验的角度来看,禁用按钮比仅仅忽略点击要好得多,因为它给你的用户一些视觉反馈:命令现在不可用。显示一条消息:“不是现在,我已经在做这些事情了”也许会更好。但是在不对点击做出反应的情况下留下可点击的按钮是不好的。


更新:在 OP 澄清问题后(在评论中)

好吧,当按钮被按下时,我立即禁用它,然后数据处理序列如下,当它完成时我重新启用按钮。但我认为这个问题与数据处理它使应用程序无响应这一事实有关,但表单仍会注册点击,并且在重新启用后再次按下按钮。

您应该异步运行此操作(在后台线程上)。使用 BackgroundWorker 对象并在其 RunWorkerCompleted 事件中重新启用按钮。

它解决了这个问题。

于 2012-08-21T13:01:07.710 回答
3

您可以删除处理程序:

this.button.Click -= button_Click;

然后在处理后重新恢复。

于 2012-08-21T12:52:16.380 回答
1

我不知道 C#,但我认为您可以(创建并)在处理事件时检查变量alreadyClicked是否为 true,如果不是,则将其设置为 true,然后正常处理事件。
这样当用户第二次点击按钮时,已经点击为真,代码不会被执行

于 2012-08-21T12:53:38.173 回答
0

我可以考虑是否有很多方法可以防止这种情况发生,但一个非常快速的方法是在表单上设置一个布尔变量,检查用户是否已经点击了按钮,并且只在第一次执行 on_click 事件中的代码时他点击按钮。

于 2012-08-21T12:55:06.940 回答
0

而不是触发您使用按钮的单击事件处理的任何内容,而是通过提交表单来触发它。因此,一旦用户第一次提交表单,您就可以防止默认表单,直到您决定这样做。

于 2012-08-21T12:56:57.287 回答
0

以上答案均不正确。

真正的原因是:执行按钮点击事件处理方法的是主线程,也是检测到有鼠标点击并决定如何处理的主线程。

在您的按钮单击事件处理程序中,您首先禁用按钮,然后执行耗时的工作,然后在最后启用按钮,希望在您执行耗时的工作时,会处理并忽略以下鼠标点击. 但这种情况并非如此。主线程只有在完成事件处理程序后才能查看以下鼠标单击,并且到那时按钮已重新启用!

所以你需要做的是禁用事件处理程序中的按钮,然后,在该事件处理程序结束时,启动一个 100 毫秒的计时器,然后让计时器重新启用按钮。这样,当主线程退出您的事件处理程序时,按钮保持禁用状态,主线程继续执行并消耗以下鼠标单击并浪费它们,然后计时器启动并重新启用按钮,以便您可以单击它再次。

于 2016-04-11T05:37:16.260 回答