当属性更改时,DataGridView控件滚动到顶部

10

在Windows窗体中,我有一个DataGridView控件,其中的记录是由数据源(数据绑定)填充的。每个记录都代表一个数据对象。

并非所有行都会显示:例如,只显示前10行。因此,用户可以向下滚动以查看其他记录。这没有什么特别之处。

但是,当用户在滚动后单击一行时,该行对象的数据属性会更改,这会刷新DataGridViewand - 它会“滚动”到datagrid的顶部(可能整个DataGridView会刷新)。这不是期望的结果。

如何在记录更新期间保持当前滚动位置?

1个回答

12

你可以使用DataGridView的FirstDisplayedScrollingRowIndex属性。

它获取/设置在你的DGV上显示的第一行的索引。

使用方法如下:

        int rowIndex = dataGridView.FirstDisplayedScrollingRowIndex;

        // Refresh your DGV.

        dataGridView.FirstDisplayedScrollingRowIndex = rowIndex;

如果您对 DGV 进行排序或添加/删除行,那么当然这不会完全正常工作(您确实说过您正在更新,所以也许您没问题)。


1
我遇到了相同的问题。我发现是在我的数据源上调用AcceptChanges()会导致这种情况,所以我通过在调用之前保存FirstDisplayedScrollingRowIndex的值并在调用之后恢复它来解决了这个问题。 - JonP
我遇到了完全相同的问题,但是我有点困惑应该把Jay的建议放在哪里。我已经尝试过好几个地方,但似乎没有任何区别。我还尝试在设置为DataGridView之前和之后,在我的DataSource上调用AcceptChanges(),但这似乎没有任何作用。 - Craig
使用这个解决方案,我不得不检查gridview的“Rows.Count”是否大于0,然后将其设置为“rowIndex”,否则我会得到outofrange异常,即使进行了检查条件和补偿,它们仍然会出现,直到我意识到如果没有行,我可以让gridview自己处理并滚动到顶部。 - Issung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接