如何在WinForms中暂时禁用事件处理程序?
也许最简单的方法(不需要取消订阅或其他操作)是声明一个布尔值,并在处理程序开始时检查它:
bool dontRunHandler;
void Handler(object sender, EventArgs e) {
if (dontRunHandler) return;
// handler body...
}
.Invoke()
调用函数。(要查看是否应调用Invoke()
,可以检查.InvokeRequired
。)2.不要直接从任何其他线程分配或读取变量。请注意,任何调用的调用将在主线程可以运行它之前不会运行,因此请注意死锁。 - shelleybutterfly从什么角度禁用?如果你想要从处理程序的委托列表中删除一个在你的作用域中的方法,你可以这样做...
从什么角度禁用?
如果您想从处理程序的委托列表中移除一个在您的作用域中的方法,只需执行以下操作:
object.Event -= new EventHandlerType(your_Method);
这将从委托列表中删除该方法,您可以稍后使用特定语法重新附加它。object.Event += new EventHandlerType(your_Method);
YourComponent.YourComponentEvent -= ExistingMethodForTheEvent;
启用
YourComponent.YourComponentEvent += ExistingMethodForTheEvent;
例如像 DataGridView 中的 CellFormatting 这样的事件:
//enabling
DataGridView1.CellFormatting += DataGridView1_CellFormatting;
//disabling
DataGridView1.CellFormatting -= DataGridView1_CellFormatting;
private void DgvBillings_CellFormatting(...) {
...
}
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);
var lSender = sender as RadioButton;
if (lSender?.Checked != true)
return;