在更新期间挂起.net事件监听器

本文关键字:net 事件 监听器 挂起 更新 | 更新日期: 2023-09-27 18:13:16

我有一个UserControl,我已经把一个下拉组合框和一个DataGridView。

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

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

  • DataGridView_Load
  • ComboBox_SelectedItemChanged
  • RefreshButton_Clicked

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

问题是,当我单击刷新按钮时,刷新函数被调用多次。单击刷新按钮触发RefreshButton_Clicked。刷新将重新初始化组合框。重新初始化ComboBox会触发ComboBox_SelectedItemChanged,因为选中的Item不再相同。然后我必须放置在刷新之前被选中的项目,这样就会触发另一个ComboBox_SelectedItemChanged。等。

是否有一种方法可以挂起事件侦听器,而我刷新和恢复它之后?

在更新期间挂起.net事件监听器

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

刷新按钮"隐藏"它的动作看起来像一个代码气味,对我来说。最好由订阅者决定何时应该或不应该执行其方法。

if (!_isRefreshing)

实际情况是事件正在发生,因此禁用侦听器模糊了实际情况…如果有其他侦听器导致这个更新循环怎么办?你也会影响它。

所以你想要两个世界:事件正确触发侦听器决定它们不应该行动

您可以通过"-="操作暂时删除该事件。

例如,如果你注册了一个像这样的事件

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

可以通过

暂时取消注册
this.ComboBox1.SelectedIndexChanged -= ComboBox1_SelectedIndexChanged;

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