以编程方式逐步滚动datagridview直到它到达底部,然后滚动回到顶部

时间:2014-08-27 03:50:54

标签: c# winforms datagridview

我尝试以2为增量以编程方式滚动我的Datagridview。当它到达底部时,我想将滚动重置回顶部。

这是我目前的代码:

private int scrollPosition = 0;

            if(scrollPosition == 0)
            {
                // This means the scroll is at the top
                scrollPosition+=2;

            }
            else if(scrollPosition > 0 && scrollPosition < dataGridView1.RowCount-1 -2)
            {
                // This means the scroll is somewhere in the middle
                scrollPosition+=2;
            }
            else
            {
                // This means the scroll is at the bottom
                scrollPosition = 0;

            }
            dataGridView1.FirstDisplayedScrollingRowIndex = scrollPosition;

该代码位于每10秒调用一次的方法中。

我试过调试代码。根据我所看到的,代码永远不会触发else语句。因此,它不会将滚动重置回顶部。我做错了什么逻辑?

更新:我的错误,它在某个时刻触发了else语句。但是当卷轴已经在底部时,它不会触发else语句。由于我的Datagridview中有20个条目,因此滚动位置需要一段时间才能接近该值。

在我的scrollPosition达到触发else语句的值之前,Datagridview滚动已经在底部。

是否有更准确的变量我可以比较我的scrollPosition?因此,当我的Datagridview滚动已经在底部时,它会在正确的时间触发else语句。

1 个答案:

答案 0 :(得分:4)

您的计算并未考虑显示的行数。

如果Rows都具有相同的高度,则可以使用以下方法计算它们:

rVisible = dataGridView1.Height / dataGridView1.Rows[0].Height - 1;

或者马克建议:

rVisible = dataGridView1.DisplayedRowCount(false);

现在您可以将滚动代码简化为:

if (dataGridView1.FirstDisplayedScrollingRowIndex + rVisible < dataGridView1.Rows.Count)
    dataGridView1.FirstDisplayedScrollingRowIndex += 2; 
else dataGridView1.FirstDisplayedScrollingRowIndex = 0;

无需scrollPosition变量。

在原始解决方案中,您还可以检查FirstDisplayedScrollingRowIndex是否停止增长,一旦最后一行可见,它就会停止增长,但这更简单。如果行具有不同的高度DisplayedRowCount或者应该使用后一种方式,那么您不必总结不同的高度。