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

时间:2009-04-13 16:36:20

标签: c# winforms

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

5 个答案:

答案 0 :(得分:50)

可能最简单的方法(不需要取消订阅或其他东西)是声明一个布尔值并在处理程序的开头检查它:

bool dontRunHandler;

void Handler(object sender, EventArgs e) {
   if (dontRunHandler) return;

   // handler body...
}

答案 1 :(得分:49)

从什么角度禁用?如果要从处理程序上的委托列表中删除范围内的方法,则可以执行..

object.Event -= new EventHandlerType(your_Method);

这将从代理列表中删除该方法,您可以稍后使用

重新附加该方法
object.Event += new EventHandlerType(your_Method);

答案 2 :(得分:1)

我是这样做的,使用控件扩展名。

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

答案 3 :(得分:0)

禁用组件的事件。伪代码:

YourComponent.YourComponentEvent -= ExistingMethodForTheEvent;

启用

YourComponent.YourComponentEvent += ExistingMethodForTheEvent;

DataGridView 中 CellFormatting 等事件的示例:

//enabling
DataGridView1.CellFormatting += DataGridView1_CellFormatting;
//disabling
DataGridView1.CellFormatting -= DataGridView1_CellFormatting;

private void DgvBillings_CellFormatting(...) {
...
}

答案 4 :(得分:0)

如果您对一堆复选框或单选按钮使用一个事件处理程序,您还可以使用以下内容:

listBlobsByHierarchy(string, ContainerListBlobsOptions)