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

C# 如何仅刷新数据绑定DataGridView的可见行?,c#,winforms,data-binding,datagridview,C#,Winforms,Data Binding,Datagridview,我有一个DataGridView绑定到动态创建的自定义对象列表。这个列表不是很大,最多5000个项目。但是,自定义对象的值每50毫秒更改一次,网格在刷新值的同时挂起应用程序,最终崩溃 我的问题是:是否有一种方法可以“虚拟化”DataGridView的数据绑定,以便只刷新屏幕上实际显示的行 EDIT:我找到了我的DataGridView速度如此之慢的原因,它与数据绑定无关。因此,这个问题不再相关。作为补充说明,我认为当发生ListChanged事件时,DataGridView已经只刷新可见的行。我

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

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


EDIT:我找到了我的
DataGridView
速度如此之慢的原因,它与数据绑定无关。因此,这个问题不再相关。作为补充说明,我认为当发生
ListChanged
事件时,
DataGridView
已经只刷新可见的行。

我想您会想看看。

一篇关于虚拟模式(DataGridView)的好文章

是什么阻止了你只提取可见的子项集而不是完整的5000项?

花了很长时间搜索这个问题,这个问题不断出现,因此我将在这里链接解决我问题的答案:

我将DataGridView绑定到BindingSource,BindingSource也由用于编辑数据的组合框和文本框绑定。编辑器上的每个Leave事件都有一个很大的延迟,这是由更新数据时DataGridView重新绘制所有行引起的。甚至在使用VirtualMode时也会发生这种情况


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

我不知道
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++;  
}
int-scrollPositionFirst=dataGridView1.FirstDisplayedScrollingRowIndex;
//displayedRowCount->是我们可见的行数
var displayedRowCount=dataGridView1.displayedRowCount(false);
//循环将按显示的行数进行迭代
对于(int rowCount=0;索引这是因为我们要更新下一个可见行
scrollPositionFirst++;
}

我没有提取任何数据,列表中的对象是应用程序功能的一部分。如果我使用此方法,是否必须放弃数据绑定?