1

这个 Winforms 项目有问题。尝试在通过以下方式填充字典propList的组合框上使用 SelectedIndexChanged 事件:

comboBox1.DataSource = new BindingSource(propList, null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";

这是事件本身:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    ComboBox comboBox = (ComboBox)sender;
    //comboBox.DataSource = null;
    System.Collections.Generic.KeyValuePair<int, string> dummy =
        (System.Collections.Generic.KeyValuePair<int, string>) 
            comboBox.SelectedItem;

    //comboBox1.DataSource = new BindingSource(propList, null);
    PopulateCollars(dummy.Key);
}

然后它在 KeyValuePair 演员表上抛出这个:

Items collection cannot be modified when the DataSource property is set

我知道这是适当的演员阵容,因为调试表明:

SelectedItem  ~~~  object System.Collections.Generic.KeyValuePair<int,string>}

那么我的问题是,为什么显式转换会修改项目集合?在 C++ 上长大,其中强制转换不会修改他们正在强制转换的数据,这对我来说没有意义。

请注意,使用注释掉的行会导致空引用异常,因为显然将数据源设置为空会擦除组合框中的所有成员。

4

1 回答 1

0

无论如何,您是否在 PopulateCollars中修改了其中一个dummy.Key或自身?dummy由于我也从未见过演员更改对象的数据,因此该例程似乎更有可能是罪魁祸首。正如我在上面评论的那样,有时 VS 关于哪一行引发了错误是完全错误的。

ETA:好的,不是这样。这是一个想法。检查异常的堆栈跟踪,并查看您的方法和(在框架中)引发异常的方法之间是否有任何有趣的层。还要确保不会通过 PopulateCollars 中导致列表更改的某些内容递归调用此方法。

如果您在处理由组合框引起的更改时尝试将相同的组合框与其他数据重用,那可能行不通。

于 2012-09-07T21:58:23.653 回答