Подтвердить что ты не робот

WinForms: временно отключить обработчик событий

Как я могу временно отключить обработчик событий в WinForms?

4b9b3361

Ответ 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);