【问题标题】:Preventing user to click on a particular button when an action is being performed防止用户在执行操作时单击特定按钮
【发布时间】:2012-03-14 14:45:36
【问题描述】:

这是场景:
平台:Windows
IDE:Microsoft Visual Studio 2008
语言:C#
.NET 框架:3.5

我的应用程序包含 2 个buttons - “加载数据”和“停止加载数据”以及一个 multi-line textbox。单击“加载数据”button 后,一些数据开始加载到textbox。为了防止用户多次点击“加载数据”button,我在点击后禁用了button。当整个数据被加载到textbox 中时,“加载数据”button 再次被激活。另一方面,单击“停止加载数据”button 会停止加载数据(如果用户希望在加载整个内容之前停止它)。
如前所述,为了防止用户多次点击“加载数据”button,我禁用了button,目的是用户只能点击“停止加载数据”button,否则等待整个数据被加载到textbox。我实现了这一点。乍一看,它似乎运作良好。但是在测试时我发现即使“加载数据”button 被禁用,如果用户单击该button,虽然在那一刻什么都没有发生,但只要整个数据被加载并且button 变为再次启用,则发现在禁用状态下进行的单击被执行。就好像程序正在记录击键和鼠标点击并等待按钮再次变为活动状态。但是我的程序中没有这样的击键或鼠标点击记录工具。是什么导致了这样的活动?我怎样才能防止这种行为?

谢谢。

【问题讨论】:

  • 您是否通过不使用后台线程来执行操作来阻塞 UI?
  • @winSharp93:我正在使用后台线程来执行操作。但我仍然遇到了一些问题。感谢 Yahia,因为建议的解决方案对我有用。

标签: c# windows visual-studio-2008


【解决方案1】:

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

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

要使其对用户可见,您可以在执行开始时禁用按钮并在执行完成时启用它...

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

【讨论】:

  • 我真的很喜欢这个解决方案。另外,您也可以在您的业务中使用此技术:)。
  • 是的,这就是我在业务中经常使用它的原因。当您在线程中开始工作并且不想在第一个工作完成之前启动另一个工作时,它的机制几乎相同。
  • Imo,这是一个过度设计的解决方案。
  • @Tigran 我同意在某些情况下可能会有更简单的解决方案......但基本上我喜欢坚持适用于各种情况的模式
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    看看这篇文章:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        好吧,又是另一种解决方案:

        在开始加载时,只需隐藏一个load 按钮并取而代之(比如说)显示一个进度条。加载完成或stop loading 单击使load 按钮再次可见。在这种情况下,您可以避免您抱怨的“连锁点击”管理。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多