WinForms: temporarily disable an event handler

后端 未结 3 1027
难免孤独
难免孤独 2020-12-10 10:22

How can I disable an event handler temporarily in WinForms?

相关标签:
3条回答
  • 2020-12-10 11:02

    Probably, the simplest way (which doesn't need unsubscribing or other stuff) is to declare a boolean value and check it at the beginning of the handler:

    bool dontRunHandler;
    
    void Handler(object sender, EventArgs e) {
       if (dontRunHandler) return;
    
       // handler body...
    }
    
    0 讨论(0)
  • 2020-12-10 11:09

    I'm doing it in this way, using a control extension.

    public static void SetDatasource(
      this ComboBox cb, 
      object dataSource, 
      EventHandler _SelectedIndexChanged_eventHandler = null, 
      EventHandler _SelectedValueChanged_eventHandler = null)
    {
    //disable events
      if (_SelectedIndexChanged_eventHandler != null) cb.SelectedIndexChanged -= _SelectedIndexChanged_eventHandler;
      if (_SelectedValueChanged_eventHandler != null) cb.SelectedValueChanged -= _SelectedValueChanged_eventHandler;
      if (cb.InvokeRequired)
      {
        cb.BeginInvoke(new _d_SetDatasource_ComboBox(SetDatasource), new object[] { cb, dataSource, _SelectedIndexChanged_eventHandler});
      }
      else
      {
        cb.DataSource = dataSource;
        //events enabled again
        if (_SelectedIndexChanged_eventHandler != null) cb.SelectedIndexChanged += _SelectedIndexChanged_eventHandler;
        if (_SelectedValueChanged_eventHandler != null) cb.SelectedValueChanged += _SelectedValueChanged_eventHandler;
      }
    }
    private delegate void _d_SetDatasource_ComboBox(ComboBox cb, object dataSource, EventHandler _SelectedIndexChanged_eventHandler = null, EventHandler _SelectedValueChanged_eventHandler = null);
    
    0 讨论(0)
  • 2020-12-10 11:19

    Disable from what perspective? If you want to remove a method that's in your scope from the list of delegates on the handler, you can just do..

    object.Event -= new EventHandlerType(your_Method);
    

    This will remove that method from the list of delegates, and you can reattach it later with

    object.Event += new EventHandlerType(your_Method);
    
    0 讨论(0)
提交回复
热议问题