C# 在虚拟模式下从datagrid检索行时发生C异常

C# 在虚拟模式下从datagrid检索行时发生C异常,c#,datagridview,virtualmode,C#,Datagridview,Virtualmode,当我从虚拟模式datagrid中检索行列表时,我一直遇到一个异常(见下文),这种情况只发生在我的行数超过屏幕上显示的行数时,而不是每次都发生。关于虚拟模式,我有什么遗漏吗 更新>下图显示了问题,索引现在超出列表范围。原因是假设我有10个项目,我隐藏了5个,因为它们不需要,我想在5个可见的项目上运行一些代码,现在有5个项目,但是一些项目的索引可能在5-9之间,我如何重新索引?当我在visible 5上运行了一些代码后,我会显示隐藏的5,这样我就不想对它们进行破坏,当它们都可见时,我需要重新编制索引

当我从虚拟模式datagrid中检索行列表时,我一直遇到一个异常(见下文),这种情况只发生在我的行数超过屏幕上显示的行数时,而不是每次都发生。关于虚拟模式,我有什么遗漏吗

更新>下图显示了问题,索引现在超出列表范围。原因是假设我有10个项目,我隐藏了5个,因为它们不需要,我想在5个可见的项目上运行一些代码,现在有5个项目,但是一些项目的索引可能在5-9之间,我如何重新索引?当我在visible 5上运行了一些代码后,我会显示隐藏的5,这样我就不想对它们进行破坏,当它们都可见时,我需要重新编制索引。非常感谢


我只在DataGridView中使用了虚拟模式,但在虚拟模式中,您应该自己存储数据,并在datagrid需要渲染时提供数据。我假设datagrid只创建了填充视图所需的最少数量的项,然后出于性能原因重用它们。

这在我看来有点像线程问题。您是否使用BackgroundWorker或类似的工具来填充_items变量?当你在它上面循环时,它看起来像是在改变_项中的东西的数量

也许您可以尝试将处理_项的任何和所有代码围绕在以下内容中:

lock (_items) 
{
    // your code
}

或者,如果填充/更改代码仍在运行,则中断这些函数并返回null。可能使用某种布尔sentinel变量。

您是如何设置数据绑定的


您是否可以使用底层数据集而不是通过datagrid进行操作。

请注意DataGridView的虚拟模式限制。尽管其假定的低内存消耗特性,但只有可见行从数据库中加载;每一行都有自己的实例来证明,尝试调整每个DataGridView行的大小,行的大小可以彼此独立设置,因此每一行的信息例如。行高需要保存在自己的内存中

当您设置RowCount时,它将根据您在RowCount中指定的值实例化n个行。因此,DataGridView的虚拟模式的最初目的之一就是降低内存消耗。内存消耗过多可能会减慢datagrid的显示速度


请参阅我的文章和另一篇文章

Hi Shiraz,说来话长,但我理想情况下需要使用datagrid中已有的数据。我添加了第三张图片,显示失败行的值为null,其他行的值为true或false。我删除了旧图片,因为新图片清楚地显示了问题,我需要重新编制索引,我想,我该怎么做?谢谢你的帮助,我将不胜感激。谢谢