GWT 2.4选择项目时DataGrid自动滚动

GWT 2.4选择项目时DataGrid自动滚动,gwt,datagrid,vertical-scrolling,Gwt,Datagrid,Vertical Scrolling,我正在一个项目中使用GWT2.4的新数据网格。我将DataGrid配置为页面大小为50。 可用屏幕不够大,无法显示所有项目,因此会显示一个垂直滚动条(这实际上是首先使用DataGrid的主要目的)。 我在数据网格上附加了一个SingleSelectionModel,以便能够选择项目。 到目前为止,这一切都很好 不过,我还有另一个小部件,用户可以与之交互。根据该用户操作,应从数据网格中选择一个项目。 有时所选项目不在可见屏幕区域,用户必须在数据网格中向下滚动才能看到它。 是否有任何方法可以自动或手

我正在一个项目中使用GWT2.4的新数据网格。我将DataGrid配置为页面大小为50。
可用屏幕不够大,无法显示所有项目,因此会显示一个垂直滚动条(这实际上是首先使用DataGrid的主要目的)。
我在数据网格上附加了一个SingleSelectionModel,以便能够选择项目。
到目前为止,这一切都很好

不过,我还有另一个小部件,用户可以与之交互。根据该用户操作,应从数据网格中选择一个项目。
有时所选项目不在可见屏幕区域,用户必须在数据网格中向下滚动才能看到它。
是否有任何方法可以自动或手动向下滚动,以便所选项目可见?

我检查了DataGrid的接口,发现没有合适的方法或函数来执行此操作。

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

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


哦,由于这是一个小部件与另一个小部件对话,您可能已经设置了一些消息传递和一些消息处理程序,这样当用户与第二个小部件交互并“选择”该项时,消息将在EventBus上触发,该消息的处理程序将按照我所描述的方式修复数据网格。我认为您必须自己进行布线。

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

示例代码:

dataGrid.getRowElement(INDEX_OF_SELECTED_ITEM).scrollIntoView();

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

dataGrid.getRowElement(dataGrid.getVisibleItems().indexOf(object)).getCells().getItem(0).scrollIntoView();

我的解决方案稍微好一点:

dataGrid.getRow(model).scrollIntoView();

我在做上述操作时遇到了一个越界异常

我在DataGrid中使用ScrollPanel解决了这个问题,并在ScrollPanel上使用了.scrollToTop()等等。但是,要访问DataGrid中的ScrollPanel,我必须使用以下注释:

正如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();
}
public void scrollIntoView(T next){
int index=datagrid.getVisibleItems().indexOf(下一步);
NodeList cells=datagrid.getRowElement(index.getCells();
int firstVisibleIndex=-1;
对于(int i=0;i 0))
firstVisibleIndex=i;
cells.getItem(firstVisibleIndex>=0?firstVisibleIndex:0);
}

谢谢你的建议。我在另一个CellTable中实现了类似的功能,我计算了CellTable的高度,这样就不会得到任何滚动条。然而,我切换到DataGrid的原因是它具有滚动的能力。你的建议当然行。但是,我希望避免重新绘制显示的初始信息,这些信息不会因选择项目而改变。交互是通过演示者完成的(我使用的是GWTP)。两个小部件都在一个视图中,通信工作正常。感谢您的建议。那很好。下面是完整的代码:dataGrid.getRowElement(dataGrid.getVisibleItems().indexOf(MyObject)).scrollIntoView();