【问题标题】:ListBox throwing ArgumentOutOfRangeException after BindingSource updateBindingSource 更新后 ListBox 抛出 ArgumentOutOfRangeException
【发布时间】:2014-09-11 10:37:53
【问题描述】:

我在尝试通过绑定源选择添加到列表框的新项目时遇到此异常。

这是带有自定义对象数据源的 BindingSource

BindingSource bs = new BindingSource() { DataSource = myObjectsList };
listbox.DataSource = bs;
listbox.DisplayMember = "MyObjectProperty";

当我向 BindingSource 添加新项目时,列表框会更新,但我无法选择新项目

bs.Add(new MyObject());
int newItemIndex = listbox.Items.Count - 1; // this returns the right index of the new added item
listbox.SelectedIndex = newItemIndex;

这里我得到 System.ArgumentOutOfRangeException(InvalidArgument='0' 的值对'SelectedIndex' 无效。)

如果我在系统异常中禁用调试中断,程序会继续运行并且项目被选中,但如果列表框实际上有项目,我无法理解为什么我会收到该错误。

【问题讨论】:

    标签: c# winforms binding listbox


    【解决方案1】:

    发生错误是因为在 WPF 中事情是异步发生的。如果您尝试通过将其指定为SelectedItem 来选择新项目,您会发现它可能不会被选中。您可以在TabControl 上对此行为提出疑问。原因是仅仅因为您已将项目添加到数据源并不意味着控件已在 GUI 中呈现并显示该项目。它需要做一些事情,比如生成容器(可能是ListBoxItem),如果还没有发生,那么该项目还没有真正添加。因此,当您设置 SelectedIndex 时,您会收到错误消息。

    tl;dr:该项目尚未添加到 GUI 中,因此您的索引无效。仅仅因为支持集合具有并不意味着它真的存在的项目;-)

    【讨论】:

    • 感谢您的回答,但我认为我的问题在某种程度上有所不同:按照您的建议,我做了一些进一步的调试,这就是我得到的:如果我像描述的那样添加新项目而且我没有以编程方式选择它,然后每次我选择它或离开它(在运行时)时,我总是会收到该错误,就像该项目实际上不存在一样。
    • 如果你使用SelectedItem而不是SelectedIndex会发生什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 2013-09-26
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多