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

时间:2009-09-16 21:18:13

标签: c# winforms datagridview

我正在使用一组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中单击它)我得到一个异常,说明“索引-1没有值”

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

4 个答案:

答案 0 :(得分:10)

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

如果您最初绑定的 集合未通知DGV更改(例如,集合没有,但BindingList会这样做),则初始当前行偏移将被正确设置为-1,(因为它是空的。)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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