7

我在一个项目中使用 GWT 2.4 的新DataGrid 。我将 DataGrid 配置为页面大小为 50。
可用屏幕不够大,无法显示所有项目,因此会显示一个垂直滚动条(这实际上是首先使用 DataGrid 的主要目的)。
我将SingleSelectionModel附加到 DataGrid 以便能够选择项目。
到目前为止,这工作正常。

但是,我还有另一个用户可以与之交互的小部件。基于该用户操作,应选择DataGrid中的一个项目。
有时所选项目不在可见屏幕区域中,用户必须在 DataGrid 中向下滚动才能看到它。
有什么方法可以自动或手动向下滚动,以使所选项目可见?
我检查了DataGrid 的JavaDocs,发现没有合适的方法或函数来做这件事。

4

6 回答 6

9

不知道这是否有效,但您可以尝试获取用于选择的行元素并使用 scrollIntoView 方法。

示例代码:

dataGrid.getRowElement(INDEX_OF_SELECTED_ITEM).scrollIntoView();
于 2011-09-28T19:32:34.127 回答
6

上面的答案效果很好,但如果网格比你的窗口宽并且有一个水平滚动条,它也会一直滚动到右边,这很烦人。通过获取所选行中的第一个单元格然后让它滚动到视图中,我能够让它向下滚动并保持向左滚动。

dataGrid.getRowElement(dataGrid.getVisibleItems().indexOf(object)).getCells().getItem(0).scrollIntoView();
于 2012-02-17T21:11:57.943 回答
2

没有时间尝试,但DataGrid 实现了接口HasRows,而HasRows 有一个称为setVisibleRange 的方法。您只需要找出您想要关注的项目的行号,然后将可见范围从该数字设置为 n 到 n+50。这样,DataGrid 将重置以将该项目放在顶部(或者如果它位于支持 DataGrid 的列表的最后 50 个元素中,则靠近顶部)。不要忘记重绘您的 DataGrid。

你已经看过这个了吗?如果是这样,我会惊讶于它不起作用。

哦,由于这是一个小部件与另一个小部件对话,您可能设置了一些消息传递和一些消息处理程序,以便当用户与第二个小部件交互并“选择”项目时,消息会在 EventBus 和处理程序上触发该消息按照我所描述的方式修复了 DataGrid。我想你必须自己做这个接线。

于 2011-09-28T16:00:25.807 回答
1

我的解决方案,好一点:

dataGrid.getRow(model).scrollIntoView();
于 2012-11-23T12:54:16.553 回答
1

我在执行上述操作时遇到了超出范围的异常。

我解决了它在 DataGrid 中获取 ScrollPanel 并在 ScrollPanel 上使用了 .scrollToTop() 等。但是,要访问 DataGrid 中的 ScrollPanel,我必须使用以下评论: http ://code.google.com/p/google-web-toolkit/issues/detail?id=6865

于 2013-08-22T14:26:25.780 回答
0

正如 Kem 指出的,在 scrollIntoView 之后的“scrollToRight”效果很烦人。在我之后,Kem 的解决方案提供了比基本解决方案更好的行为,因为通常表中的第一列更有意义。我改进了一点他的方法,通过在应用滚动然后滚动到它之前计算左侧的第一个可见列,水平滚动到我们想要可见的行的第一列。

最后一点:绝对左侧的列针对“51”进行测试。这是我通过查看浏览器的开发者工具中的 JS 值“实验性地”发现的一个值,我认为这取决于表格的样式,您可能需要更改/计算它。

代码下方:

public void scrollIntoView(T next) {
        int index = datagrid.getVisibleItems().indexOf(next);
        NodeList<TableCellElement> cells = datagrid.getRowElement(index).getCells();
        int firstVisibleIndex = -1;
        for(int i=0; i<cells.getLength() && firstVisibleIndex<0;i++)
            if(UIObject.isVisible(cells.getItem(i)) && (cells.getItem(i).getAbsoluteLeft() > 51) && (cells.getItem(i).getAbsoluteTop() > 0))
                firstVisibleIndex = i;

        cells.getItem(firstVisibleIndex>=0? firstVisibleIndex : 0).scrollIntoView();
}
于 2016-02-12T12:46:25.263 回答