DataGridView对象数据绑定问题“索引-1没有值”

我使用一组DataGridViews(dgv)通过属性显示类的成员。 我使用dgv,以便用户可以在视图中编辑成员的值(因此我不必显示用于编辑该值的表单或文本框)。

我正在显示的类的结构如下

Class1 (Displayed in a list view) Collection Of class2 (Displayed in a dgv, we'll call it dgv1) Collection of class3 (Displayed in a dgv, we'll call it dgv2) 

Class3存在,因为字符串集合不会在dgv中显示为字符串。 (长度显示在dgv中。

Class2和Class3具有我想在dgv中编辑的字符串属性,因此它们是dgv中显示的唯一值。

当我将class2或class3的新实例添加到它们各自的父类时,我重新绑定显示该集合的dgv。

添加类的新实例后,它出现在dgv中,但是如果我去选择值(通过在dgv中单击它)我得到一个exception,说明“索引-1没有值”

如果我将编辑的信息保存到表单然后重新打开表单,则不会出现此问题。 我之前无法编辑的值可以编辑而不会出现问题。

我知道这个问题很老但是:

如果你最初绑定一个没有通知DGV变化的空集合(例如,集合没有,但是BindingList没有),则初始当前行偏移将正确设置为-1,(因为它是空的。)

当您随后将对象添加到数据绑定集合时,它们仍将在网格上正确显示 ,但不会通知CurrencyManager任何更改,并且当前行偏移将固定为-1。

因此,当您尝试编辑行时,CurrencyManager认为您正在尝试编辑偏移-1处的行,并抛出exception。

要解决此问题,您需要在与行交互之前重新绑定,或者在包含一个或多个项目时最初绑定Collection等。

我将我的数据源从List(Of T)更改为List(Of T).ToArray()

我也知道它已经过时了,但我对此很挣扎,我找到的最佳解决方案是使用BindList而不是常规列表。

我刚刚在一个非常简单的应用程序中遇到了一个非常类似的“索引-1”问题,该应用程序正在进行可选数据集的“仅显示”。 这完全是我的错,因为我使用了List,它工作得很好,直到它突然没有。 切换到BindingList解决了它。