这里非常具体和奇怪的问题,谷歌和其他人无法给我答案。
我有一个带有两个组合框的表单,我们会说 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 正常工作,但它无法返回数据。启用注释掉的行可以让它返回值,但会阻止它刷新。
此代码不会显示两件事:
即使您将注释行放入,一切正常,直到您从 ComboBox A 进行第二次选择。换句话说,如果您从 ComboBox A 中选择一次,ComboBox B 将根据您的输入刷新。但是如果从 A 中的选择发生变化,B 会冻结显示的最后一个值,并且滚动时长列表不再更新。
填充 ComboBox A 和 B 的代码几乎相同,它们的单击处理程序也是如此,但 A 始终可以正常工作,而当您从 A 中进行第二次选择时,B 会冻结。
我只能从理论上推测其原因,但我的猜测是拆箱使用了一些临时内存位置,该位置讨厌被触摸两次。根据 A 的选择填充 B 的代码也可能存在一些问题,但是当取消装箱被注释掉时它工作正常这一事实减少了这种怀疑。
据我所知,我需要执行以下操作之一:
- 以另一种方式访问 SelectedItem
- 无需拆箱即可访问 SelectedItem 中的数据
- 找到一种完全避免拆箱的方法
为格式化道歉,StackOverflow 似乎忽略了我试图使其更具可读性