【问题标题】:Scrolling DataGridView per pixel每像素滚动 DataGridView
【发布时间】: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


【解决方案1】:

您需要将您的 DGV 添加到面板

【讨论】:

  • 这对我帮助很大,将 DGV 添加到面板解决了滚动问题。
【解决方案2】:

我已经放弃了对 DGV 的需求,因此也放弃了这种方法。我创建了一个 FlowLayoutPanel,其中包含动态创建的面板以显示所需的数据,并按照我想要的方式进行设计。

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

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

【讨论】:

    猜你喜欢
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2014-11-08
    • 2011-05-26
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多