2011-09-28 66 views
7

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

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

回答

9

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

示例代码:

dataGrid.getRowElement(INDEX_OF_SELECTED_ITEM).scrollIntoView(); 
+1

感谢您的建议。这工作正常。以下是完整的代码: dataGrid.getRowElement(dataGrid.getVisibleItems()。indexOf(MyObject))。scrollIntoView(); –

2

没有时间去尝试它,但DataGrid实现了HasRows接口,HasRows除其他外还有一个名为setVisibleRange的方法。您只需要计算想要关注的项目的行号,然后将该数字n的可见范围设置为n + 50。这样,DataGrid将重置以将该项目放在顶部(如果它位于支持DataGrid的列表的最后50个元素中,则位于顶部)。别忘了重绘你的DataGrid。

你已经看过这个吗?如果是这样,我会很惊讶,它没有奏效。

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

+0

感谢您的建议。我在另一个CellTable中执行了类似的计算CellTable高度的操作,因此我没有得到任何滚动条。然而,我切换到DataGrid的原因是有滚动的能力。当然你的建议会奏效。但是,我想避免重新绘制显示的初始信息不会通过选择项目来更改。 交互是通过Presenter完成的(我正在使用GWTP)。这两个小工具都在视图中,通信工作正常。 –

6

上述工程的答案还算不错,但如果网格是比你的窗宽,具有水平滚动条,这也滚动一路向右,这是相当烦人。我可以通过获取所选行中的第一个单元格然后让它滚动到视图中来让它向下滚动并保持向左滚动。

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

我的解决办法,好一点:

dataGrid.getRow(model).scrollIntoView(); 
0

由于凯姆指出,这很烦人的scrollIntoView后的“scrollToRight”的效果。在我之后,凯姆的解决方案比基础解决方案提供了更好的行为,因为通常表格中的第一列更有意义。 我改进了一点他的方法,它通过在应用滚动然后滚动它之前计算左边的第一个可见列,水平滚动到我们希望可见的那一行的第一列。

最后一点:列绝对左侧是针对“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(); 
}