【问题标题】:Windows Forms: isLoading vs event disconnectionWindows 窗体:isLoading 与事件断开连接
【发布时间】:2009-11-19 15:17:04
【问题描述】:

在 Windows 窗体编程中,我遇到了这个普遍问题。当页面加载和填充时,在某些情况下我不希望事件处理程序中的逻辑运行。

事件处理代码主要用于响应用户交互,但它也会在以编程方式操作控件时运行。过去,我看到人们使用 IsLoading 布尔值来保护只应在响应用户输入时出现的逻辑。这让我觉得有点不雅,而且开发人员必须记住把它放在任何地方;当添加新功能时,这尤其是一个问题。

最近我一直在编写方法来在加载表单时断开事件处理程序,然后重新连接它们(在 finally 子句中)。这似乎更好一些,但我想知道是否有更优雅的方式。有人有其他方法来处理这种情况吗?

【问题讨论】:

    标签: c# .net user-interface winforms


    【解决方案1】:

    这里没有“正确”的答案,但我同意你的方法并多次使用它。虽然无论如何修改小部件都会触发我的事件很好,但有时这正是我想要避免的。我经常在我的表单中编写 DisableFooEventHandlers()/EnableFooEventHandlers() 方法对。这让查看代码的人清楚我要完成的工作。我尝试在匹配的方法/事件设置中使用这些,例如:

    void BeginBulkProcessing()
    {
        DisbaleFooEventHandlers();
        ...
    }
    
    void OnBulkProcessingComplete()
    {
        ...
        EnableFooEventHandlers();
    }
    

    并不迷人,但它可以达到目的,并且很清楚这里发生了什么。我还没有找到更好的东西,因为最后,只有我(程序员)知道我什么时候应该暂停处理,这很容易追踪。

    【讨论】:

      【解决方案2】:

      解决此类问题最优雅的方法是使用模型视图演示器设计模式。这里的后台代码并没有直接修改控件的状态,而是改变了模型,然后触发了 UI 的更新。在 WinForms 的情况下,很难实现正确的 MVP 模式,但您可以使用数据绑定将应用程序的状态与实际控件分开。正确实现绑定后,后台代码更新数据后,应该会自动显示在控件中。

      【讨论】:

      • 框架级数据绑定是否会避开填充控件上的事件处理程序?例如 _TextChanged 事件?我们确实为这些表单使用了一种 MVC 形式,但我的经验是,以任何方式填充控件的行为通常都会触发事件处理程序。
      【解决方案3】:

      我认为这个问题是相关的,并且你会感兴趣:

      WinForms: temporarily disable an event handler

      【讨论】:

      • 对 - 我知道该怎么做,但问题是这是否是最好的模式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2010-11-16
      • 2013-08-01
      • 2021-10-14
      相关资源
      最近更新 更多