C# 按像素滚动DataGridView

C# 按像素滚动DataGridView,c#,winforms,reflection,datagridview,C#,Winforms,Reflection,Datagridview,我正在制作一个.NET4WinForms应用程序,它从数据库中读取数据并在DGV中显示行。但是,行数大于一次可以在屏幕上显示的最大行数。要显示所有数据,我需要自动滚动DGV直到最后一行,然后更新数据源以刷新DGV 我发现通过简单地将FirstDisplayedScrollingRowIndex增加一就可以轻松做到这一点。 但是滚动太快了。我想它滚动顺利 为此,我尝试直接调用ScrollRows方法。该方法不是公开的,所以我必须像这样使用反射: var scrollRows = dgv.GetTy

我正在制作一个.NET4WinForms应用程序,它从数据库中读取数据并在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\u Tick
方法调用此代码

DGV平滑滚动,但在开始时可见的行下方不会绘制任何行


有什么方法可以使其平滑滚动并正确显示数据吗?

您需要将DGV添加到面板中

您需要将DGV添加到面板中

我不再需要DGV,因此不需要这种方法。我已经创建了一个FlowLayoutPanel,其中的面板是动态创建的,以显示所需的数据,并按照我希望的方式进行了设计

可能有一种方法可以执行DataGridView的平滑滚动,这可以通过分析DataGridView代码的.NET反射来实现,但是,我再次找到了一种可以接受的替代方法,并且正在使用它


有一种方法可以通过将DGV实际放置在带有滚动条的面板上来实现DGV的平滑滚动。这样,滚动面板也会滚动DGV。这种方式对我来说并不方便,因为DGV标题会被滚动出屏幕,我需要它们在任何时候都可见

我不再需要DGV,因此也不再需要这种方法。我已经创建了一个FlowLayoutPanel,其中的面板是动态创建的,以显示所需的数据,并按照我希望的方式进行了设计

可能有一种方法可以执行DataGridView的平滑滚动,这可以通过分析DataGridView代码的.NET反射来实现,但是,我再次找到了一种可以接受的替代方法,并且正在使用它


有一种方法可以通过将DGV实际放置在带有滚动条的面板上来实现DGV的平滑滚动。这样,滚动面板也会滚动DGV。这种方式对我来说并不方便,因为DGV标题会被滚动出屏幕,我需要它们在任何时候都可见

你在滚动后尝试调用
Invalidate()
了吗?@KingKing刚刚做了,
dgv.Invalidate()
的作用与
dgv.Refresh()
相同,将垂直滚动偏移量重置为0。很难平滑地滚动
DataGridView
,这不是因为
滚动条,这是因为DataGridView如何呈现其单元格,通常我们不需要如此平滑的滚动,但我同意在某些情况下需要这样做。@KingKing我也确信这是可能的,因为我想做的与抓取滚动条并将其向下拉时所做的相同。这是可能的,但太难了。事实上,当您滚动
时,
DataGridView
将获得信息并相应地呈现其
,它的设计目的是呈现行,以便
第一个显示的行
始终恰好从
ClientRectangle
的顶部开始。如果你能找到方法,我很高兴收到你的通知。同样,这对于
winforms
来说太难了。我为您想到了这种方法,您可以将网格添加到
面板
,正确布局网格,然后将使用面板的
滚动条
。您是否尝试在滚动后调用
Invalidate()
,将垂直滚动偏移重置为0。很难平滑滚动
DataGridView
,这不是因为
滚动条,而是因为DataGridView如何呈现其单元格,通常我们不需要如此平滑的滚动,但我同意在某些情况下是需要的。@KingKing我也确信这是可能的,因为我想做的和你抓起滚动条向下拉时一样。这是可能的,但太难了。事实上,当您滚动
时,
DataGridView
将获得信息并相应地呈现其
,它的设计目的是呈现行,以便
第一个显示的行
始终恰好从
ClientRectangle
的顶部开始。如果你能找到方法,我很高兴收到你的通知。同样,这对于
winforms
来说太难了。我为您想到了这种方法,您可以将网格添加到
面板
,正确布局网格,然后使用面板的
滚动条
。这对我很有帮助,将DGV添加到面板解决了滚动问题。这对我很有帮助,将DGV添加到面板解决了滚动问题。