Reputation: 15571
How can I disable an event handler temporarily in WinForms?
Upvotes: 43
Views: 75413
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
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
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
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
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