2011-09-28 67 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(); 
}