使用变量激活或停用EventHandler



有没有办法将这些空隙合并为一个?我有很多控件使用相同的事件,在执行过程中激活和停用

private void activate()
{
tb1.TextChanged += eventFil;
tb2.TextChanged += eventFil;
cb1.CheckStateChanged += eventFil;
cb2.CheckStateChanged += eventFil;            
}
private void deactivate()
{
tb1.TextChanged -= eventFil;
tb2.TextChanged -= eventFil;
cb1.CheckStateChanged -= eventFil;
cb2.CheckStateChanged -= eventFil;            
}

像这个

private void activate(operator aux)
{
tb1.TextChanged aux eventFil;
tb2.TextChanged aux eventFil;
cb1.CheckStateChanged aux eventFil;
cb2.CheckStateChanged aux eventFil;            
}

或者像这个

private void activate()
{            
aux(c => c += eventFiltre);
}
private void deactivate()
{            
aux(c => c -= eventFiltre);
}
private void aux(Action<EventHandler> action)
{
action(tb1.TextChanged);
....
}

一个解决底层问题而不是眼前问题的替代方案:引入处理程序开关。

最容易用代码解释:

class YourClass
{
private bool CanHandleTextChanged = true;
// It has probably specialized EventArgs, but you get the gist ...
// This would be "eventFil" in your example
private void TextChangedHandler ( object sender, EventArgs e )
{
if (!CanHandleTextChanged) return;
// ... handle TextChanged Event
}
}

然后,您可以通过简单地将布尔字段CanHandleTextChanged设置为true或false来激活或停用事件处理。

我认为这是不可能的,因为+=和-=只能出现在赋值中。为了更好地维护,您可以使用一个方法,但每个事件都有两句话:

private void EnableEvents(bool enabled = true)
{
if (enabled)
{
tb1.TextChanged += eventFil;
tb2.TextChanged += eventFil;
cb1.CheckStateChanged += eventFil;
cb2.CheckStateChanged += eventFil;            
}
else
{
tb1.TextChanged -= eventFil;
tb2.TextChanged -= eventFil;
cb1.CheckStateChanged -= eventFil;
cb2.CheckStateChanged -= eventFil;            
}
}

您可以使用这样的方法

//you can pass true or false
private void Operate(bool isActivation)
{
if(isActivation)
{
tb1.TextChanged += eventFil;
tb2.TextChanged += eventFil;
cb1.CheckStateChanged += eventFil;
cb2.CheckStateChanged += eventFil;  
}
else
{
tb1.TextChanged -= eventFil;
tb2.TextChanged -= eventFil;
cb1.CheckStateChanged -= eventFil;
cb2.CheckStateChanged -= eventFil;
}      
}

最新更新