我尝试以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语句。
答案 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
或者应该使用后一种方式,那么您不必总结不同的高度。