C# 以编程方式按增量滚动datagridview,直到它到达底部,然后滚动回顶部

C# 以编程方式按增量滚动datagridview,直到它到达底部,然后滚动回顶部,c#,winforms,datagridview,C#,Winforms,Datagridview,我试图以编程方式以2为增量滚动我的Datagridview。当它到达底部时,我想将滚动条重置回顶部 这是我目前的代码: private int scrollPosition = 0; if(scrollPosition == 0) { // This means the scroll is at the top scrollPosition+=2; }

我试图以编程方式以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;
private int scrollPosition=0;
如果(滚动位置==0)
{
//这意味着卷轴位于顶部
滚动位置+=2;
}
else if(scrollPosition>0&&scrollPosition
该代码位于每10秒调用一次的方法中

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

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

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


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

您的计算不考虑显示的行数

以下是如何计算它们,前提是所有行都具有相同的高度:

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;
if(dataGridView1.FirstDisplayedScrollingRowIndex+rVisible
不需要
scrollPosition
变量


在最初的解决方案中,您还可以检查
FirstDisplayedScrollingRowIndex
是否停止增长,在最后一行可见时会停止增长,但这更简单。如果行具有不同的高度,则应使用
DisplayedRowCount
或后一种方式,这样就不必对不同的高度求和

您的计算不考虑显示的行数

以下是如何计算它们,前提是所有行都具有相同的高度:

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;
if(dataGridView1.FirstDisplayedScrollingRowIndex+rVisible
不需要
scrollPosition
变量


在最初的解决方案中,您还可以检查
FirstDisplayedScrollingRowIndex
是否停止增长,在最后一行可见时会停止增长,但这更简单。如果行具有不同的高度,则应使用
DisplayedRowCount
或后一种方式,这样就不必对不同的高度求和

我写它是为了保护自己。如果我试图直接将其与dataGridView1.RowCount进行比较,则应用程序可能会崩溃,因为滚动大于RowCount。dataGridView1.RowCount-1被视为与底部等效。因为我增加了2,所以我做了dataGridView1.RowCount-1-2。这让我很困惑,请建议一个更好的逻辑你可能想试试这个:如果向下滚动时滚动位置不再改变,那么你已经到达底部了。绝对scrollposition值是不可靠的,至少可以这么说,依我看,我发现即使Datagridview滚动已经在底部,scrollposition仍然会增加2(它仍然会触发第二个if语句)。我已经更新了我原来的帖子。添加了有关我的调试的更多详细信息。底部是否定义为只有最后一行或两行可见?还是目标是在最后一行可见时立即停止?我会从你的代码中猜出前者。@马克-我的计划是:当卷轴已经到达底部,并且调用了我使用上述代码的方法时,我想将卷轴重置回顶部。因此,在将滚动条重置回顶部之前,滚动条几乎需要位于底部(即,用户已经可以看到最后一行)。我编写它是为了保护。如果我试图直接将其与dataGridView1.RowCount进行比较,则应用程序可能会崩溃,因为滚动大于RowCount。dataGridView1.RowCount-1被视为与底部等效。因为我增加了2,所以我做了dataGridView1.RowCount-1-2。这让我很困惑,请建议一个更好的逻辑你可能想试试这个:如果向下滚动时滚动位置不再改变,那么你已经到达底部了。绝对scrollposition值是不可靠的,至少可以这么说,依我看,我发现即使Datagridview滚动已经在底部,scrollposition仍然会增加2(它仍然会触发第二个if语句)。我已经更新了我原来的帖子。添加了有关我的调试的更多详细信息。底部是否定义为只有最后一行或两行可见?还是目标是在最后一行可见时立即停止?我会从你的代码中猜出前者。@马克-我的计划是:当卷轴已经到达底部,并且调用了我使用上述代码的方法时,我想将卷轴重置回顶部。真漂亮