取消装箱会冻结Winforms ComboBox

时间:2012-10-26 20:31:23

标签: c# winforms combobox selecteditem unboxing

这里非常具体和奇怪的问题,谷歌和其他人无法给我答案。

我有一个带有两个ComboBox的表单,我们会说A和B.选择A中的项目从数据库中提取一些信息,将其放入Dictionary中,并使用BindingSource将其放入B.当用户选择某些内容时从B开始,返回值被设置,没有别的。

问题在于ComboBox B.在其SelectedIndexChanged处理程序中,尝试取消装入其SelectedItem会导致ComboBox“冻结”,因此它不再显示ListBox B中新选择的结果,并且滚动时不会刷新长列表/下。但是,如果您记得数据的位置

,ComboBox仍可正常运行

B的SelectedIndexChanged处理程序:

private void comboBox2_SelectedIndexChanged_1(object sender, EventArgs e)
{
    if (dataSourceSelect)
        return;
    else
    {
        ComboBox comboBox = (ComboBox)sender;

        var dummy = comboBox2.SelectedItem;
        // System.Collections.Generic.KeyValuePair<int, string> dummy2 =
        //     (System.Collections.Generic.KeyValuePair<int, string>)dummy;
    }
}

有两个虚拟变量可以显示它不是导致问题的SelectedItem属性,只是取消装箱。

使用这个确切的代码可以让ComboBox正常工作,但它无法返回数据。启用注释掉的行可以返回值,但不会刷新它。

此代码有两件事不会显示:

  1. 即使您将注释行放入,一切正常,直到您从ComboBox A进行第二次选择。换句话说,如果您从ComboBox A 中选择一次,ComboBox B将根据您的输入刷新。但是,如果A中的选择已更改,则B冻结显示的最后一个值,滚动时不再更新长列表。

  2. 填充ComboBox A和B的代码与它们的点击处理程序几乎完全相同,但A一直没有任何问题,当你从A中进行第二次选择时B会冻结。

  3. 我只能理解这个原因,但我的猜测是取消装箱会使用一些不喜欢触摸两次的临时内存位置。根据A的选择填充B的代码可能也存在一些问题,但是当拆箱被注释掉时它工作正常的事实减少了这种怀疑。

    据我所知,我需要做以下其中一项:

    1. 以另一种方式访问​​SelectedItem
    2. 访问SelectedItem中的数据而不取消装箱
    3. 找一个完全避免拆箱的方法
    4. 格式化的道歉,StackOverflow似乎忽略了我试图让它更具可读性

1 个答案:

答案 0 :(得分:0)

非常感谢Thomas Levesque(https://stackoverflow.com/users/98713/thomas-levesque)建议在评论中检查异常。

由于我想在A中进行新选择后将一个填充了不同信息的新字典分配到ComboBox B中,我首先将其B的DataSource设置为null(在A的SelectedIndexChanged事件中)。这触发了B的SelectedIndexChanged事件,该事件试图访问空列表的SelectedItem,抛出NullReferenceError,导致错误和冻结。

有两种方法可以避免这种情况:

  1. 在尝试取消装箱值
  2. 之前,检查B的SelectedItem是否为空
  3. 使用其他代码阻止SelectedIndexChanged事件访问B的SelectedItem