George
George

Reputation: 15571

WinForms: temporarily disable an event handler

How can I disable an event handler temporarily in WinForms?

Upvotes: 43

Views: 75413

Answers (5)

user2029101
user2029101

Reputation: 196

If you are using the just one event handler for a bunch of checkboxes or radio buttons you can also use something like:

var lSender = sender as RadioButton;
if (lSender?.Checked != true)
    return;

Upvotes: 0

Red Magda
Red Magda

Reputation: 428

Disabling the event for the component. Pseudocode:

YourComponent.YourComponentEvent -= ExistingMethodForTheEvent;

Enabling

YourComponent.YourComponentEvent += ExistingMethodForTheEvent;

Example for events like CellFormatting in DataGridView:

//enabling
DataGridView1.CellFormatting += DataGridView1_CellFormatting;
//disabling
DataGridView1.CellFormatting -= DataGridView1_CellFormatting;

private void DgvBillings_CellFormatting(...) {
...
}

Upvotes: 3

FlavioG
FlavioG

Reputation: 51

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);

Upvotes: 2

Adam Robinson
Adam Robinson

Reputation: 185703

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);

Upvotes: 59

Mehrdad Afshari
Mehrdad Afshari

Reputation: 422320

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...
}

Upvotes: 62

Related Questions