DataGrid ScrollIntoView - 如何滚动到第一行未显示的行?

9

我正在尝试使用代码向下滚动WPF DataGrid。

我使用:

int itemNum=0;
private void Down_Click(object sender, RoutedEventArgs e)
{
    if (itemNum + 1 > dataGridView.Items.Count - 1) return;
    itemNum += 1;
    dataGridView.UpdateLayout();
    dataGridView.ScrollIntoView(dataGridView.Items[itemNum]);
}

只有在当前未显示itemNum行时,此功能才会向下滚动。

例如,如果DataGrid足够长以容纳10行数据,而我有20行数据,则需要调用此函数11次(直到itemNum为11),以便滚动到下一行。

如果该行已适合网格(即使是屏幕上的最后一行),它不会向下滚动。

我希望调用此方法时,网格将把下一行带到网格顶部(就像滚动条一样)。

为什么它没有起作用?

2个回答

20
使用 DataGridView.FirstDisplayedScrollingRowIndex。
 int itemNum=0;
    private void Down_Click(object sender, RoutedEventArgs e)
    {
        itemNum++;
        if (itemNum > dataGridView.Items.Count - 1) return;
        //dataGridView.UpdateLayout();  <-- I don't think you need this
        dataGridView.FirstDisplayedScrollingRowIndex = itemNum;
    }

抱歉,我没有意识到WPF网格没有那个功能。但滚动的问题仍然存在。

如果项目已在视图中,则ScrollIntoView不会滚动,并且如果它在当前可见行下面,则将其设置为最后一行,因此当您滚动到第11个项目时,它看起来像是滚动到第二个。

这个解决方法应该适用于您。您需要滚动到最底部的行,然后向上滚动到需要的任何行。请注意,在这里,您实际上需要更新布局,否则它会忽略第一个滚动的结果,然后再次向上滚动。

        dataGridView.ScrollIntoView(DataGrid1.Items[DataGrid1.Items.Count - 1]);
        dataGridView.UpdateLayout();
        dataGridView.ScrollIntoView(DataGrid1.Items[itemIndex]);

2
很抱歉,但这是WPF中的DataGrid,有些粗鲁的人删除了我主题中的WPF部分,可能只是为了得分。您建议的内容适用于WINDOWS FORM DataGridView。 - Programer
正是我所需要的,而且非常清晰易懂......如果当前所选项为最后一项,则滚动必须向上进行,直到该特定记录最终可见。谢谢。 - DRapp

3

看这个,它是关于ListBox的,但是其中的见解非常棒,可能也适用于表格:

简单地说:ListBox中的项是异步加载的,因此如果在CollectionChanged事件(或类似事件)中调用ScrollIntoView(),它将还没有任何项目,因此不会滚动。

希望对你有所帮助,对我肯定有帮助!;-)


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