C# 取消装箱将冻结Winforms组合框

C# 取消装箱将冻结Winforms组合框,c#,winforms,combobox,selecteditem,unboxing,C#,Winforms,Combobox,Selecteditem,Unboxing,这是一个非常具体和奇怪的问题,谷歌和其他公司都无法给我答案 我有一个带有两个组合框的表单,我们称为a和B。在a中选择一个项目会从数据库中提取一些信息,将其放入字典,并使用BindingSource将其放入B。当用户从B中选择某个内容时,将设置返回值,而不设置其他内容 问题在于组合框B。在其SelectedIndexChanged处理程序中,尝试取消其SelectedItem的装箱会导致组合框“冻结”,因此它不再显示列表框B中新选择的结果,并且长列表在上/下滚动时不会刷新。不过,如果您还记得数据的

这是一个非常具体和奇怪的问题,谷歌和其他公司都无法给我答案

我有一个带有两个组合框的表单,我们称为a和B。在a中选择一个项目会从数据库中提取一些信息,将其放入字典,并使用BindingSource将其放入B。当用户从B中选择某个内容时,将设置返回值,而不设置其他内容

问题在于组合框B。在其SelectedIndexChanged处理程序中,尝试取消其SelectedItem的装箱会导致组合框“冻结”,因此它不再显示列表框B中新选择的结果,并且长列表在上/下滚动时不会刷新。不过,如果您还记得数据的位置,组合框仍然可以工作

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;
    }
}
private void组合框2\u SelectedIndexChanged\u 1(对象发送方,事件参数e)
{
如果(数据源选择)
返回;
其他的
{
ComboBox ComboBox=(ComboBox)发送方;
var dummy=comboBox2.SelectedItem;
//System.Collections.Generic.KeyValuePair dummy2=
//(System.Collections.Generic.KeyValuePair)虚拟;
}
}
有两个伪变量表明导致问题的不是SelectedItem属性,而是取消装箱

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

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

  • 即使您输入了注释行,在从组合框a进行第二次选择之前,一切都正常。换句话说,如果您从组合框a选择一次,组合框B将根据您的输入刷新。但是,如果A中的选择被更改,B将冻结显示的最后一个值,并且长列表在滚动时不再更新

  • 填充组合框A和B的代码几乎相同,它们的单击处理程序也是如此,但A始终可以正常工作,而B在您从A中进行第二次选择时会冻结

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

    据我所知,我需要执行以下操作之一:

  • 以另一种方式访问SelectedItem
  • 无需取消装箱即可访问SelectedItem中的数据
  • 找到一种避免完全取消装箱的方法

  • 为格式问题道歉,StackOverflow似乎忽略了我使其更具可读性的尝试

    非常感谢Thomas Levesque()建议检查注释中的异常

    由于我想在a中的新选择之后将一个充满不同信息的新字典分配到ComboBox B中,所以我首先将其B的数据源设置为null(在a的SelectedIndexChanged事件中)。这触发了B的SelectedIndexChanged事件,该事件试图访问空列表的SelectedItem,引发NullReferenceError,导致错误和冻结

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

  • 在尝试取消装箱之前,检查B的SelectedItem是否为null
  • 使用其他代码阻止SelectedIndexChanged事件访问B的SelectedItem

  • SelectedItem.GetType()返回的类型是什么?你确定演员没有抛出异常吗?从你的问题中可以看出两件有趣的事情。它的类型是“KeyValuePair`2”,我还没有研究过它,也不知道它是否与KeyValuePair有显著的不同。事后来看,检查异常是显而易见的事情,因为它会在a的第二个选择上抛出一个null引用异常。我将检查它们之间的代码,我相信我将某个值设置为null/0以防止出现不同的问题
    KeyValuePair``2
    仅仅意味着KeyValuePair是一个具有2个类型参数的泛型类型;通常,类型参数在方括号中指定。无论如何,是的,SelectedItem在某个点上可能为null,因此您需要在强制转换之前检查它是否为null。尝试取消对空值的装箱总是失败的。通过本项目了解更多关于C#的信息。由于我将一个充满不同信息的新字典分配到组合框B中,所以我首先将其数据源设置为null。这触发了SelectedIndexChanged事件,该事件试图访问空列表的SelectedItem,导致错误和冻结。非常感谢你提出这个例外,这已经困扰了我好几天了