C# WinForms:暂时禁用事件处理程序

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/744494/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-04 23:29:41  来源:igfitidea点击:

WinForms: temporarily disable an event handler

c#winforms

提问by George

How can I disable an event handler temporarily in WinForms?

如何在 WinForms 中临时禁用事件处理程序?

采纳答案by Mehrdad Afshari

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

回答by Adam Robinson

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

回答by FlavioG

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