2011-09-28 8 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を再描画することを忘れないでください。

あなたはすでにこれを見ましたか?もしそうなら、私はそれがうまくいかないことに驚くだろう。

これは別のウィジェットと話すウィジェットであるため、ユーザがそのメッセージを設定してメッセージハンドラを使用して、そのウィジェットと対話してそのアイテムを「選択」すると、メッセージがイベントバスそのメッセージのハンドラは、私が記述した行に沿ってDataGridを修正します。私はあなた自身がこの配線をしなければならないと思います。

+0

感謝。私は、CellTableの高さを計算してスクロールバーが表示されないように、別のCellTableで同様のものを実装しました。しかし、私がDataGridに切り替えたのは、スクロールできる能力でした。もちろんあなたの提案はうまくいくでしょう。しかし、表示されている初期情報を再描画しないようにするには、項目を選択して変更しないでください。 インタラクションはプレゼンター(私はGWTPを使用しています)を通じて行われます。どちらのウィジェットもビューにあり、通信は正常に動作しています。 –

6

グリッドは、あなたのウィンドウよりも広く、水平スクロールバーを持っているならば、それもかなり迷惑である右にすべての方法をスクロールしても上記の答えは、かなりうまく動作します。私はそれをスクロールダウンし、選択された行の最初のセルを取得し、それをビューにスクロールすることによって左にスクロールしたままにすることができました。

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

私のソリューション、少し良く:

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

は、私は上記をやっ境界例外のアウトを得ました。

DataGridでScrollPanelを取得して解決し、ScrollPanelで.scrollToTop()などを使用しました。しかし、私はこのコメントを使用していたのDataGridにScrollPanelにアクセスするには:ケムが指摘したように http://code.google.com/p/google-web-toolkit/issues/detail?id=6865

0

することは、それがの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(); 
} 
関連する問題