如何仅刷新数据绑定DataGridView的可见行?

时间:2009-08-10 09:24:27

标签: c# winforms data-binding datagridview

我有一个DataGridView绑定到动态创建的自定义对象列表。此列表不是很大,最多5000个项目。但是,自定义对象的值每50ms更改一次,并且网格会在刷新值时挂起应用程序,并最终崩溃。

我的问题是:有没有办法“虚拟化”DataGridView的数据绑定,以便只刷新屏幕上实际显示的行?

编辑:我发现为什么我的DataGridView如此之慢并且与数据绑定无关。所以这个问题已经不再适用了。作为旁注,我认为当DataGridView事件发生时ListChanged已经只刷新了可见行。

5 个答案:

答案 0 :(得分:2)

关于虚拟模式(DataGridView)的好文章。 - http://www.codeproject.com/KB/books/PresentDataDataGridView.aspx#7

答案 1 :(得分:1)

花了很长时间搜索这个问题并且这个问题不断出现,所以我会在这里链接解决我问题的答案:https://stackoverflow.com/a/9348149/674884

我有一个绑定到BindingSource的DataGridView,它也被ComboBoxes和用于编辑数据的TextBox绑定。编辑器上的每个Leave事件都有一个很大的延迟,这是因为DataGridView在更新数据时重绘了所有的行。即使使用VirtualMode也会发生这种情况。

问题是由DataGridView列的AllCells自动调整大小设置引起的。每次更改值时,DataGridView都会遍历所有行,以找到用于自动调整列的最长字符串。禁用自动调整后,我意识到即使是数据绑定DataGridView也只绘制可见行,因此不需要使用VirtualMode。

答案 2 :(得分:0)

我想你会想看看using the DataGridView in virtual mode

答案 3 :(得分:0)

什么阻止你只是拉动可见的项目子集而不是完整的5000?

答案 4 :(得分:0)

我不知道ListChanged是否仅刷新可见行。 我在MSDN中看不到任何缩进。稍后,我将研究DataGridView的实现并进行更新。

无论如何,以下内容对我有用:

int scrollPositionFirst = dataGridView1.FirstDisplayedScrollingRowIndex;

// displayedRowCount -> is our visible rows count
var displayedRowCount = dataGridView1.DisplayedRowCount(false);

// the loop will iterate in the amount of the displayed rows
for (int rowCount = 0; index < displayedRowCount; rowCount++)
{
    // scrollPositionFirst is our first visable row 
    // so scrollPositionFirst is our starting point
    var set = (Set)dataGridView1.Rows[scrollPositionFirst].DataBoundItem;

    // we update the grid from the first visable(displayed) index 
    UpdateMainGrid(scrollPositionFirst, set);

    // increment index -> this is done because we want to update the next visible row
    scrollPositionFirst++;  
}