在执行操作时阻止用户单击特定按钮

时间:2012-03-14 14:45:36

标签: c# windows visual-studio-2008

以下是该情景:
平台:Windows
IDE:Microsoft Visual Studio 2008
语言:C#
.NET框架:3.5

我的应用程序包含2个buttons - “加载数据”和“停止加载数据”以及multi-line textbox。点击“加载数据”button后,一些数据开始加载到textbox。为防止用户多次点击“加载数据”button,我点击了button后再将其停用。当整个数据加载到textbox中时,“加载数据”button会再次被激活。另一方面,单击“停止加载数据”button,停止加载数据(如果用户希望在加载整个内容之前停止加载)。
如前所述,为防止用户多次点击“加载数据”button,我已禁用button,意图用户只能点击“停止加载数据”{{1}或者等待整个数据加载到button。我实现了这个。乍一看似乎效果很好。但是在测试时我发现尽管“加载数据”textbox被禁用,但如果用户点击button,虽然没有任何事情发生,但是一旦整个数据加载并且button再次启用,发现在禁用状态期间发出的单击被执行。好像程序正在记录击键和鼠标点击并等待按钮再次变为活动状态。但是我的程序中没有这样的按键或鼠标点击记录功能。是什么导致了这样的活动?我该如何防止这种行为?

感谢。

5 个答案:

答案 0 :(得分:3)

一种选择是使用重入哨兵:

您可以定义一个int字段(初始化为0)并在输入方法时通过Interlocked.Increment更新它,并且仅在它为1时才继续。最后只需执行Interlocked.Decrement

要使用户可以看到它,您可以在执行开始时禁用该按钮,并在执行完成时启用它...

顺便说一句:长时间运行的任务应该是异步的(例如通过一个单独的线程)......

答案 1 :(得分:0)

如果您将呼叫设为同步呼叫,它将锁定整个页面,直到加载完成。

否则你只是在做你已经尝试过的方法,我想看看你的禁用状态的代码,因为有些东西告诉我你刚刚让它看起来被禁用了,它仍然是一个功能按钮

答案 2 :(得分:0)

看看这篇文章:

http://www.codeguru.com/forum/showthread.php?t=480279

我的第一个想法是删除事件处理程序并在click事件结束时重新绑定它。该线程建议使用BackgroundWorker并使其异步。

答案 3 :(得分:0)

我敢打赌,在加载数据之前你甚至无法移动表单,也无法停止加载数据。问题是整个表单冻结直到加载完成。您必须在单独的线程中移动加载部件。

答案 4 :(得分:0)

嗯,又来了一次:

在开始加载时,只需隐藏load按钮,代替它(比如说)显示进度条。加载完成后或在stop loading点击后再次显示load按钮。在这种情况下,您可以避免抱怨的“链接点击”管理。

或管理一个按钮。首先是load,点击后,变为stop load。考虑到有限的屏幕空间,您会经常在移动环境中找到这样的解决方案。但我认为它也可以应用于桌面,也很成功。为什么不呢?