Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C防止combox selectionChanged事件调用自身_C#_.net - Fatal编程技术网

C# C防止combox selectionChanged事件调用自身

C# C防止combox selectionChanged事件调用自身,c#,.net,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 be

我有这个事件处理程序,我需要在某些条件下更改它的选定项 用密码。当我这样做的时候,它会因为被更改而调用处理程序并重新执行。我怎样才能防止这种情况

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

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

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

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

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

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

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

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

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

自NET 1.1以来,Microsoft已发生ComboBox.SelectionChangeCommitted事件 为了防止这个问题

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

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

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

显然,我不确定您的特定案例的逻辑应该是什么,但这是基于您所写的一小部分的最佳猜测。类将只处理其他每一个事件_shouldHandle=true应该是if_shouldHandle块的一部分,以确保已处理的事件仅在其完成时才释放处理未来事件的锁。显然,我不确定您的特定情况的逻辑应该是什么,但这是基于您所做的少量操作的最佳猜测。类将只处理其他所有事件_shouldHandle=true应该是if_shouldHandle块的一部分,以确保已处理的事件只有在完成后才释放处理未来事件的锁。@AlexFarber-这会导致不必要的开销吗?@roryap我同意,这可能会花费更多的成本我必须在表单加载序列上这样做,在处理程序中尝试,但出现问题。使用下面的布尔方法。@AlexFarber-这会导致不必要的开销吗?@roryap我同意,这可能会花费更多的成本。我必须在表单加载序列上执行此操作,在处理程序中尝试过,但遇到了问题。使用下面的布尔方法。我研究了这个事件,似乎是我所需要的一个非常可行的解决方案。我应该提到的是,我使用的是WPF,从我所知道的情况来看,WPF在中并不存在。谢谢你的建议,我将在我的表单应用程序中使用它。我研究了这个事件,似乎是一个非常可行的解决方案,以满足我的需要。我应该提到的是,我使用的是WPF,从我所知道的情况来看,WPF在中并不存在。谢谢你的建议,我将在我的表单应用程序中使用它。