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
WinForms: temporarily disable an event handler
提问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);