防止表单接收鼠标点击

时间:2012-08-21 12:47:24

标签: c# winforms onclick

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

简单地禁用按钮(buttonBackupNow.Enabled = false;)没有帮助,因为即使按钮​​被禁用,如果用户多次单击按钮,表单会在上次数据处理后立即注册点击并重新启动数据处理例程。

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

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

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

6 个答案:

答案 0 :(得分:4)

  

简单地禁用按钮(buttonBackupNow.Enabled = false;)不会   帮助,因为如果用户甚至多次点击该按钮   按钮被禁用,表单注册点击并重新启动数据   在上一个数据处理程序完成后立即处理。

真的?你是如何完成的?我根本无法复制它。禁用该按钮会阻止Click事件被触发。

这本身应该足够了。 你不应该去除事件(以及使用其他技巧)。如果你需要诉诸于此,某些地方的某些东西可能不对(也许某些代码重新启用按钮?)。

即使删除处理程序也无法解决问题 - 正如您自己在回答Justin Harvey的回答时所说的那样 - 向我保证问题出在其他地方。


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


在OP澄清问题(在评论中)后,

更新

  

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

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

它解决了这个问题。

答案 1 :(得分:3)

您可以删除处理程序:

this.button.Click -= button_Click;

然后在处理后重新启动。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

使用按钮的click事件触发它,而不是使用表单的提交触发它。因此,一旦用户首次提交表单,您只需在表决之前阻止默认表单。

答案 5 :(得分:0)

以上答案都不正确。

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

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

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

相关问题