2

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

我有一个带有两个组合框的表单,我们会说 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 会冻结。

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

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

  1. 以另一种方式访问​​ SelectedItem
  2. 无需拆箱即可访问 SelectedItem 中的数据
  3. 找到一种完全避免拆箱的方法

为格式化道歉,StackOverflow 似乎忽略了我试图使其更具可读性

4

1 回答 1

0

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

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

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

  1. 在尝试拆箱值之前检查 B 的 SelectedItem 是否为空
  2. 使用其他代码阻止 SelectedIndexChanged 事件访问 B 的 SelectedItem
于 2012-10-26T21:43:31.440 回答