【发布时间】:2013-10-16 20:42:47
【问题描述】:
我正在制作一个 .NET 4 WinForms 应用程序,它从数据库中读取数据并在 DGV 中显示行。但是,行数大于一次可以在屏幕上显示的最大行数。要显示所有数据,我需要自动滚动 DGV 直到最后一行,然后更新数据源以刷新 DGV。
我发现只需将FirstDisplayedScrollingRowIndex 加一即可轻松做到这一点。
但是滚动太锐利了。我希望它能够流畅地滚动。
为此,我尝试直接调用ScrollRows 方法。该方法不是公开的,所以我不得不像这样使用反射:
var scrollRows = dgv.GetType().GetMethod("ScrollRows", BindingFlags.Instance | BindingFlags.NonPublic);
scrollRows.Invoke(dgv, new object[] { 1, -1, ScrollEventType.SmallIncrement });
我从每 20 毫秒触发一次的 timer_Tick 方法调用此代码。
DGV 平滑滚动,但不会在开始时可见的行下方绘制任何行。
有什么方法可以让它平滑滚动并正确显示数据?
【问题讨论】:
-
您是否尝试在滚动后拨打
Invalidate()? -
@KingKing 刚刚做了,
dgv.Invalidate()的行为与dgv.Refresh()相同,将垂直滚动偏移重置为 0。 -
DataGridView很难平滑滚动,不是因为ScrollBars,而是因为DataGridView如何渲染它的Cells,通常我们不需要如此流畅的滚动,但我同意在某些情况下需要它。 -
@KingKing 我也确信这是可能的,因为我想做与您抓住滚动条并将其拉下时所做的相同的事情。
-
有可能,但太难了。事实上,当您
scroll时,DataGridView将获取信息并相应地渲染其Rows,它旨在渲染行,因此First displayed row应始终准确地从ClientRectangle的顶部开始。如果您发现如何执行此操作,我很高兴收到您的通知。同样,这对winforms来说太难了。我为您想到了这种方法,您可以将您的网格添加到Panel,正确布局您的网格,然后将使用面板的ScrollBar。
标签: c# winforms reflection datagridview