DataGridView:仅当滚动条在底部时才自动向下滚动

6
我有一个程序,使用 dataGridView 显示数据,并通过将行添加到 dataGridView 实现每秒自动更新数据。
当我想要阅读开头附近的内容时,我向上滚动,即使数据更新,滚动条也不会下移,这很好。但是我只希望在滚动条位于 dataGridView 底部时才下移滚动条。
当文本添加新行时,我想要的行为是:
如果滚动条在底部,则自动向下滚动。 如果滚动条在其他位置,则不滚动。
我编写的代码不幸地不能实现这个功能。
 private void liveDataTable_Scroll(object sender, ScrollEventArgs e)
 {
    ScrollPosition = liveDataTable.FirstDisplayedScrollingRowIndex; 

    if (ScrollPosition == liveDataTable.RowCount - 1)
    {
       IsScrolledToBottom = true;
    }
    else
    {
       IsScrolledToBottom = false;
    }            
 }
 public void AddRowToDataGridMethod()
 {
    dataTable.Rows.Add();

    if (dataWin.IsScrolledToBottom == true)
         dataWin.LiveDataTable.FirstDisplayedScrollingRowIndex = (dataWin.ScrollPosition + 1);
    else
         dataWin.LiveDataTable.FirstDisplayedScrollingRowIndex = dataWin.ScrollPosition;         
 }

1
看一下这个问题:https://dev59.com/e3RC5IYBdhLWcg3wMeHf它应该可以解决你的问题。 - jAC
可能是滚动到C# DataGridView底部的重复问题。 - Samiey Mehdi
3个回答

16

你可以尝试这个:

int firstDisplayed = liveDataTable.FirstDisplayedScrollingRowIndex;
int displayed = liveDataTable.DisplayedRowCount(true);
int lastVisible = (firstDisplayed + displayed) - 1;
int lastIndex = liveDataTable.RowCount - 1;

liveDataTable.Rows.Add();  //Add your row

if(lastVisible == lastIndex)
{
     liveDataTable.FirstDisplayedScrollingRowIndex = firstDisplayed + 1;
}

基本上,检查最后一行是否可见,如果可见,则在添加新行后向下滚动1行。


1

我想补充一下,另一种将其滚动保持在底部的方法是...

基本上,这个方法假设你当前显示了10行,并且正在处理每一行。当它到达第11行时,它会向上滚动1行,使得现在的行在底部被显示。你可以例如加1,这样它将保持你的行+1,因此它将位于离底部最后一行的旁边。

if (myRow.Displayed == false)
{
  int intDisplayRows = myRow.Index - dataView_Database.DisplayedRowCount(false);
  dataView_Database.FirstDisplayedScrollingRowIndex = intDisplayRows;
}

1
 private void dgZavod_RowsAdded_1(object sender, DataGridViewRowsAddedEventArgs e) {
     dgZavod.FirstDisplayedScrollingRowIndex = dgZavod.Rows[dgZavod.Rows.Count - 1].Index;
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接