每像素滚动DataGridView

时间:2013-10-16 20:42:47

标签: c# winforms reflection datagridview

我正在创建一个.NET 4 WinForms应用程序,它从数据库中读取数据并在DGV中显示行。但是,行数大于可以同时适合屏幕的最大行数。要显示所有数据,我需要自动滚动DGV直到最后一行,然后更新数据源以刷新DGV。

我发现只需将FirstDisplayedScrollingRowIndex增加一个即可轻松完成。 然而,滚动太尖锐。我希望它顺利滚动。

为此,我尝试直接调用ScrollRows方法。那个方法不公开,所以我不得不像这样使用Reflection:

var scrollRows = dgv.GetType().GetMethod("ScrollRows", BindingFlags.Instance | BindingFlags.NonPublic);
scrollRows.Invoke(dgv, new object[] { 1, -1, ScrollEventType.SmallIncrement });

我从timer_Tick方法调用此代码,该方法每20毫秒触发一次。

DGV平滑滚动,但它不会在开头可见的行下面画任何一行。

有什么方法可以让它顺利滚动并正确显示数据吗?

2 个答案:

答案 0 :(得分:0)

您需要将DGV添加到Panel

答案 1 :(得分:0)

我已经放弃了对DGV的需求,因此也采用了这种方法。我创建了一个FlowLayoutPanel,其中动态创建了Panel,以按照我希望的方式设计所需的数据。

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

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