在更新期间暂停.Net事件侦听器

时间:2013-05-13 18:48:43

标签: c# winforms events

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

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

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

  • DataGridView_Load
  • ComboBox_SelectedItemChanged
  • RefreshButton_Clicked

刷新数据网格时,ComboBox会重新初始化,因为网格中存在的ProductType列表可能会发生变化。

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

您可以暂时取消注册

this.ComboBox1.SelectedIndexChanged -= ComboBox1_SelectedIndexChanged;

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

答案 1 :(得分:2)

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

刷新按钮“隐藏”它的动作对我来说就像一个代码味道。订户最好决定何时应该或不应该执行其方法。

if (!_isRefreshing)

现实情况是 事件正在发生,因此禁用侦听器会掩盖现实......如果有其他侦听器导致此更新循环怎么办? ?你也会影响它。

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