【问题标题】:VB.net 2010 - IndexOutOfRange from datagridview when refreshing datasetVB.net 2010 - 刷新数据集时来自 datagridview 的 IndexOutOfRange
【发布时间】:2010-10-06 18:31:47
【问题描述】:

我的表单上有一个 datagridview,该表单绑定到另一个类的数据集中的表。

我使用数据适配器来填充该数据集中的表格,并且网格可以很好地显示数据。

工作正常。

在我的表单上,我有一个用户可以输入的文本框,它将传递一个参数给用于填充此表的存储过程。因此,在启动时,文本框将包含“%”。然后用户可以输入“F%”并获取以“F”开头的所有内容

因此,当该文本框更改时,我会启动异步刷新 (.BeginInvoke) 来进行刷新。该表填充了减少的记录数(我检查了 ds.table(0).rows.count 并且它是正确的)

但是 datagridview 然后开始抛出 datagridview.dataerror 事件。 "System.IndexOutofRangeException : Index # 没有值"

看起来数据集已正确填充并且没有任何问题,但数据网格不喜欢此更新。索引超出范围错误非常常见,以至于我无法通过搜索找到所需的内容。

提前致谢! :)

【问题讨论】:

  • 在数据绑定刷新数据时,当前行指针可能设置为无效行。如果我记得在数据刷新之前正确地将 currentrow 或 selectedrow 设置为 null。

标签: .net vb.net winforms datagridview


【解决方案1】:

我不知道您的具体问题的解决方案,但是当所有数据都预先加载时,每次击键都敲击数据库似乎是一种浪费。

与其每次都重新查询数据库,不如设置RowFilter of the DataView并跳过数据库调用?

【讨论】:

    【解决方案2】:

    好吧,找出错误。

    • 取出 BeginInvoke 并同步执行。看看能不能解决。如果没有,请将其保留,直到您确定没有其他问题为止。

    • @roadie 对重置 SelectedRow 有很好的评论

    • 有类似的方法来强制更新。喜欢

    ..

       bindingSource.DataSource = null; 
       bindingSource.DataSource = myTable;
    

    【讨论】:

    • Gotcha... 是的,我在没有异步调用的情况下遇到了同样的问题,但我尝试将 .DataSource 分配给任何内容,然后在刷新回调后将其放回原处,这似乎可以做到。我也可以回去检查当前选择的行。
    【解决方案3】:

    我遇到了类似的问题,这是因为我想这样做:
    dg1.CurrentCell = dg1.Rows(dg1.RowCount - 1).Cells(1)
    更改 dg1.DataSource 后。
    当 AllowUserToAddRows = True 时使用 RowCount 似乎很危险。
    我将它切换为 False 并且它起作用了。

    【讨论】:

      猜你喜欢
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 2010-09-20
      • 1970-01-01
      相关资源
      最近更新 更多