【问题标题】:Suspend .Net Event Listener during Update在更新期间暂停 .Net 事件侦听器
【发布时间】:2013-05-13 18:48:42
【问题描述】:

我有一个 UserControl,我在其中放置了一个下拉 ComboBox 和一个 DataGridView。

ComboBox 是一个过滤器,其中包含取决于我的 DataGridView 中的数据的项目。 DataGridView 中的对象有一个名为 ProductType 的属性。对于 DataGridView 中的每个 ProductType,ComboBox 过滤器将其添加到过滤器选项中。

发生以下事件时需要刷新DataGridView:

  • DataGridView_Load
  • ComboBox_SelectedItemChanged
  • RefreshButton_Clicked

当我刷新数据网格时,ComboBox 会重新初始化,因为网格中的 ProductType 列表可能已经改变。

问题是当我点击刷新按钮时,刷新函数会被多次调用。 点击刷新按钮会触发 RefreshButton_Clicked。刷新重新初始化组合框。重新初始化 ComboBox 会触发 ComboBox_SelectedItemChanged,因为所选项目不再相同。然后我必须把在刷新之前选择的项目,所以另一个 ComboBox_SelectedItemChanged 被触发。等等。

有没有办法在我刷新并恢复之后暂停事件侦听器?

【问题讨论】:

    标签: c# winforms events


    【解决方案1】:

    您可以使用bool _isRefreshing; 表示您当前正在处理中。

    对我来说,“隐藏”其操作的刷新按钮似乎是一种代码味道。最好由订阅者决定何时应该或不应该执行其方法。

    if (!_isRefreshing)
    

    现实是事件正在发生,因此禁用监听器会掩盖现实......如果有其他监听器不会导致这个更新循环?你也会影响它。

    所以你想要两个世界:事件正确触发听众决定他们不应该采取行动。

    【讨论】:

    • 我猜你是对的。如果我要在这个事件中添加代码,即使网格正在刷新也应该执行,这将是有问题的。
    【解决方案2】:

    您可以通过执行“-=”操作暂时删除该事件。

    例如,如果您注册了这样的活动

    this.ComboBox1.SelectedIndexChanged += 
                new System.EventHandler(ComboBox1_SelectedIndexChanged);
    

    您可以通过以下方式暂时取消注册

    this.ComboBox1.SelectedIndexChanged -= ComboBox1_SelectedIndexChanged;
    

    当您进行 service/db 调用以更新/过滤选项时。您可以取消注册事件并在获取数据后重新注册它们。我通常喜欢使用异步事件模式来获取后端数据,并在我进行服务调用时取消注册我的事件(或者禁用我的 UI 按钮、表单等)并在完成的回调中启用/注册它们。

    【讨论】:

    • 谢谢!现在一切都快了很多。
    猜你喜欢
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2021-06-08
    • 2012-05-24
    • 1970-01-01
    • 2019-10-20
    相关资源
    最近更新 更多