C# 取消装箱将冻结Winforms组合框
这是一个非常具体和奇怪的问题,谷歌和其他公司都无法给我答案 我有一个带有两个组合框的表单,我们称为a和B。在a中选择一个项目会从数据库中提取一些信息,将其放入字典,并使用BindingSource将其放入B。当用户从B中选择某个内容时,将设置返回值,而不设置其他内容 问题在于组合框B。在其SelectedIndexChanged处理程序中,尝试取消其SelectedItem的装箱会导致组合框“冻结”,因此它不再显示列表框B中新选择的结果,并且长列表在上/下滚动时不会刷新。不过,如果您还记得数据的位置,组合框仍然可以工作 B的SelectedIndexChanged处理程序:C# 取消装箱将冻结Winforms组合框,c#,winforms,combobox,selecteditem,unboxing,C#,Winforms,Combobox,Selecteditem,Unboxing,这是一个非常具体和奇怪的问题,谷歌和其他公司都无法给我答案 我有一个带有两个组合框的表单,我们称为a和B。在a中选择一个项目会从数据库中提取一些信息,将其放入字典,并使用BindingSource将其放入B。当用户从B中选择某个内容时,将设置返回值,而不设置其他内容 问题在于组合框B。在其SelectedIndexChanged处理程序中,尝试取消其SelectedItem的装箱会导致组合框“冻结”,因此它不再显示列表框B中新选择的结果,并且长列表在上/下滚动时不会刷新。不过,如果您还记得数据的
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正常工作,但它无法返回数据。启用注释掉的行可以让它返回值,但会阻止它刷新
有两件事此代码不会显示:
为格式问题道歉,StackOverflow似乎忽略了我使其更具可读性的尝试非常感谢Thomas Levesque()建议检查注释中的异常 由于我想在a中的新选择之后将一个充满不同信息的新字典分配到ComboBox B中,所以我首先将其B的数据源设置为null(在a的SelectedIndexChanged事件中)。这触发了B的SelectedIndexChanged事件,该事件试图访问空列表的SelectedItem,引发NullReferenceError,导致错误和冻结 有两种方法可以避免这种情况:
SelectedItem.GetType()返回的类型是什么?你确定演员没有抛出异常吗?从你的问题中可以看出两件有趣的事情。它的类型是“KeyValuePair`2”,我还没有研究过它,也不知道它是否与KeyValuePair有显著的不同。事后来看,检查异常是显而易见的事情,因为它会在a的第二个选择上抛出一个null引用异常。我将检查它们之间的代码,我相信我将某个值设置为null/0以防止出现不同的问题KeyValuePair``2
仅仅意味着KeyValuePair是一个具有2个类型参数的泛型类型;通常,类型参数在方括号中指定。无论如何,是的,SelectedItem在某个点上可能为null,因此您需要在强制转换之前检查它是否为null。尝试取消对空值的装箱总是失败的。通过本项目了解更多关于C#的信息。由于我将一个充满不同信息的新字典分配到组合框B中,所以我首先将其数据源设置为null。这触发了SelectedIndexChanged事件,该事件试图访问空列表的SelectedItem,导致错误和冻结。非常感谢你提出这个例外,这已经困扰了我好几天了