我正在使用一组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没有值”
如果我将编辑的信息保存到表单中然后重新打开表单,则不会出现此问题。我之前无法编辑的值可以编辑而不会出现问题。
答案 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解决了它。