禁止事件从其代码中触发自身

时间:2015-10-25 19:11:52

标签: c# .net winforms

char事件导致我遇到麻烦,因为我在此事件中更改了SelectedIndexChange,我想避免它。

我仍然需要在手动更改索引时调用该事件,但不在代码中。因为当我在事件中改变索引时你可能会注意到它会再次触发它。

2 个答案:

答案 0 :(得分:5)

使用布尔值指定您在事件内部。

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

答案 1 :(得分:3)

正如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;
}

Ron建议的另一种方式是由M.Kazem实现,您也可以使用该选项。