= DataGrid =
CellTableでは大きな行数のデータを表示しようとすると様々な不都合が生じる([[GWT/Widget/CellTable|CellTable]]を参照)。
DataGridでは、PageSizeを設定する必要はあるが(PageSizeを超えるデータは無視されてしまう。おそらくページングをしなければ表示されない)、勝手にスクロールバーがついてくれ、列ヘッダは固定してくれるので圧倒的に楽である。
== 参考 ==
* [[http://google-web-toolkit.googlecode.com/svn/javadoc/2.4/com/google/gwt/user/cellview/client/DataGrid.html|JavaDoc]]<
>ひどいことに、このJavaDocに記述されている例はDataGridとは無関係。
* [[http://stackoverflow.com/questions/7713218/gwt-2-4-datagrid-auto-set-column-width]]
* [[http://markmail.org/message/ycoucw2jwfg4yxjp]]
=== サンプル ===
* [[http://rvsoni.wordpress.com/2011/10/25/gwt-datagrid-with-pagination-using-simple-pager/]]
== DataGridの使えなさ ==
* DataGridでもgetVisibleRange(),getVisibleItemCount()の値は、実際にユーザに見える行数を表しているわけではなく、全データ数になってしまう。このため、大量のデータの一部のみをスクロールバーで移動しながらオンデマンドで必要なデータを取得するということはできない。結局、ページングでしかこのような仕組みは実現できないようだ(が、ページングの場合には、ブラウザのリサイズによって表示行数が変わるという問題が残る)。
しかし、GXTでもこの事情は同じようだ。以下はGXTのサンプル
{{{
import java.util.*;
import com.extjs.gxt.ui.client.data.*;
import com.extjs.gxt.ui.client.store.*;
import com.extjs.gxt.ui.client.widget.grid.*;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.google.gwt.core.client.*;
import com.google.gwt.user.client.ui.*;
public class ImageViewer implements EntryPoint {
class ModelDataAdapter implements ModelData {
public X get(String property) { throw new RuntimeException(); }
public Map getProperties() { throw new RuntimeException(); }
public Collection getPropertyNames() { throw new RuntimeException(); }
public X remove(String property) { throw new RuntimeException(); }
public X set(String property, X value) { throw new RuntimeException(); }
}
public void onModuleLoad() {
RootLayoutPanel rootPanel = RootLayoutPanel.get();
ColumnModel model =
new ColumnModel(Arrays.asList(new ColumnConfig[] { new ColumnConfig("title", 500) }));
ListStore store = new ListStore();
for (int i = 0; i < 1000; i++) {
final int index = i;
store.add(new ModelDataAdapter() {
public String get(String name) {
System.out.println("" + index);
return name + index;
}
});
}
Grid grid = new Grid(store, model);
rootPanel.add(grid);
grid.setSize("640px", "480px");
}
}
}}}
結局のところ、これはブラウザの情報の取得制限に関わる問題のようだ(あくまでも想像)。つまり、
* ブラウザ画面がリサイズしたとき、「表」を表示する領域の大きさを把握することができないか、あるいはその中に表示可能な行数を決定することができない。
* そこで、「ページサイズ」つまりページングをせずに表示可能な行数は固定的に決定するしかない。
* 一つの「ページ」中の行データは一度に取得する必要がある。ページ全体を表示するのにスクロールが必要だとしても、未表示の部分をオンデマンドで取得する、というわけにはいかない。