SelectedIndexChange
事件造成我的麻烦,因为我在此事件中更改index
,我想避免它。禁用事件自己从其代码
我手动更改索引时仍需要调用该事件,但不在代码中。因为您可能会注意到,当我在事件内部更改索引时,它会再次激发自己。
SelectedIndexChange
事件造成我的麻烦,因为我在此事件中更改index
,我想避免它。禁用事件自己从其代码
我手动更改索引时仍需要调用该事件,但不在代码中。因为您可能会注意到,当我在事件内部更改索引时,它会再次激发自己。
使用布尔值来指定您在事件中。
private bool _isRunning = false;
private void SelectedIndexChange(...)
{
if(_isRunning) return;
_isRunning = true;
// do your things
_isRunning = false;
}
编辑。正如Scott Chamberlain指出的那样,如果在事件发生期间有可能发生错误,则使用finally
语句来始终重置标志。
private bool _isRunning = false;
private void SelectedIndexChange(...)
{
if(_isRunning) return;
_isRunning = true;
try
{
// do your things
}
finally
{
_isRunning = false;
}
}
你可能想把它封装在'try/finally'中,所以如果出现错误'_isRunning'被重置。 –
@ScottChamberlain感谢您提供有用的信息。 –
正如意见中提到的Ron可以从事件中删除处理程序,并做你的工作,然后再指定处理程序事件:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//Remove handler
this.comboBox1.SelectedIndexChanged -= comboBox1_SelectedIndexChanged;
//Change index here
//Assign handler again
this.comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged;
}
而且罗恩曾建议被实施的其他方式M.Kazem,您也可以使用该选项。
您可能希望将其封装在'try/finally'中,以便在发生错误时重新订阅事件。 –
@ScottChamberlain把它放在'try/finally'中以保证重新订阅事件是非常好的主意。 –
您可以暂时取消订阅该事件,也可以在某处设置一个表示您正在操作的标志,并在标志为true时退出事件。 –