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

本文关键字:事件 调用 组合 选择 | 更新日期: 2023-09-27 18:33:25

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

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

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

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

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

您需要处理用于跳过事件处理程序中的更改的逻辑。这无法阻止事件再次触发。

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

NET 1.1以来就有ComboBox.SelectionChangeCommit 事件来防止这个问题。

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