代码之家  ›  专栏  ›  技术社区  ›  user1028741

恢复组合框。SelectedItem设置为其最后一个值会导致StackOverflow

  •  0
  • user1028741  · 技术社区  · 11 年前

    我被要求允许用户(尝试)更改组合框事件中无效的选定值。当他这样做时,我必须显示一个警告,并将组合框的SelectedItem恢复为其先前的值。

    我有一些类似的东西:

    private void cmbCountry_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
                Country selectedCountry = ((ComboBox)sender).SelectedItem as Country;
    
                if (e.RemovedItems.Count > 0 && e.AddedItems.Count > 0 && !canChange)
                {
                    e.Handled = true;
                    ((ComboBox)sender).SelectedItem = e.RemovedItems[0];
                    return;
                }
    
                // Do stuff...
    }
    

    问题是,尽管我设置了 e.Handled = true; SelectionChanged事件不断激发,给我一个StackOverflowException。。。

    我想这是一个常见的问题。。。

    我有一个优雅的解决方法吗?

    2 回复  |  直到 11 年前
        1
  •  0
  •   DrKoch    11 年前

    在您检查了@nvoigt建议的整体逻辑是否正确后,您可以将其用作暴力手段:

            if (e.RemovedItems.Count > 0 && e.AddedItems.Count > 0 && canChange)
            {
                e.Handled = true;
                canChange = false; // avoid infinite recursion
                ((ComboBox)sender).SelectedItem = e.RemovedItems[0];
                canChange = true; // reset to original value
                return;
            }
    

    这样就不会从处理程序代码中再次调用处理程序代码。

        2
  •  0
  •   nvoigt    11 年前

    如果在SelectedItem的ChangeHandler中更改SelectedItem,则会产生无限递归。这个 Handled 旗帜上只写着 这 更改已处理。对于 新 如果您创建了更改,则会再次调用此函数。

    问题是为什么 你的 改变再次触发你的逻辑?你的零钱不应该是有效的吗?您需要调试程序。设置一个断点并逐步执行您的方法,直到第二次单击它时知道错误所在。

    推荐文章