【问题标题】:DataGridView Object Databinding Issue "Index -1 does not have a value"DataGridView 对象数据绑定问题“索引 -1 没有值”
【发布时间】:2010-11-28 23:06:30
【问题描述】:

我正在使用一组 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 没有值”

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

【问题讨论】:

  • 代码的哪一部分有助于发布?这种形式有很多代码。您想查看类或表单代码吗?
  • 将 class2 或 class3 添加到他们的父母后如何重新绑定 dgv?
  • 我通过调用我最初调用的方法来重新绑定控件。
  • 你有没有发现是什么原因造成的?
  • 从来没有 :( 我也离开了那份工作,所以这个问题不再适用

标签: c# winforms datagridview


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 添加一些关于为什么这可以解决问题的解释将非常有帮助。
      【解决方案4】:

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

      如果您最初绑定的 empty 集合不通知 DGV 更改(例如 Collection 不通知,但 BindingList 通知),则初始当前行偏移量将正确设置为-1,(因为它是空的。)

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        • 2011-05-28
        • 2010-11-18
        相关资源
        最近更新 更多