C#阻止组合框选择更改事件调用自身

时间:2014-12-05 15:02:40

标签: c# .net

我需要这个事件处理程序,在某些条件下更改它的选定项目 在代码中。当我这样做时,它会调用处理程序,因为它被更改并重新执行。我该如何防止这种情况?

MessageBox.Show("Must have a repair report.", "No Report");
txtLocation.SelectedItem = MAIN_BACKGROUND.UserName; //here it recalls itself as I return its value to what it was before the change

3 个答案:

答案 0 :(得分:3)

您可以使用全局布尔值来阻止事件正文在"内部"期间执行其实质性工作。事件处理程序:

private bool _alreadyChanging = false;

private void txtLocation_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (!_alreadyChanging)
    {
        _alreadyChanging = true;
        MessageBox.Show("Must have a repair report.", "No Report");
        txtLocation.SelectedItem = MAIN_BACKGROUND.UserName;
        _alreadyChanging = false;
    }
}

答案 1 :(得分:2)

您需要处理跳过事件处理程序内部更改的逻辑。这无法阻止事件再次发射。

if(txtLocation.SelectedItem == MAIN_BACKGROUND.UserName)
    return;

MessageBox.Show("Must have a repair report.", "No Report");
txtLocation.SelectedItem = MAIN_BACKGROUND.UserName; 

编辑: 添加一个使用布尔标志来完成同样事情的例子

public Class class
{

    private bool _shouldHandle = true;
    public void EventHandler(object Sender, EventArgs e)
    {
      if(_shouldHandle)
      {
        _shouldHandle = false;
        //make change
        _shouldHandle = true;
      }
    }
}

答案 2 :(得分:1)

自.NET 1.1以来,Microsoft已经有了ComboBox.SelectionChangeCommitted事件 以防止这个问题。

该事件仅在用户更改组合框时触发。无需取消订阅 来自任何事件或使用布尔值。