Как я могу временно отключить обработчик событий в WinForms?
WinForms: временно отключить обработчик событий
Ответ 1
Возможно, самый простой способ (который не требует отписки или другого материала) - объявить логическое значение и проверить его в начале обработчика:
bool dontRunHandler;
void Handler(object sender, EventArgs e) {
if (dontRunHandler) return;
// handler body...
}
Ответ 2
Отключить с какой точки зрения? Если вы хотите удалить метод, который в вашей области действия из списка делегатов на обработчике, вы можете просто сделать.
object.Event -= new EventHandlerType(your_Method);
Это приведет к удалению этого метода из списка делегатов, и вы можете повторно связать его позже с помощью
object.Event += new EventHandlerType(your_Method);
Ответ 3
Я делаю это таким образом, используя расширение управления.
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);