如果您使用ListDataProvider来管理 DataGrid 的数据,那么在删除/添加项目时,DataGrid 将不会滚动。
这是一个在不滚动的情况下删除网格行的最小示例(全部包含在入口点类中):
DataGrid 行的类:
private class Item{
public String text;
public int value;
public Item(String text, int value){
this.text = text;
this.value = value;
}
}
填充数据网格:
这里我使用一个私有变量 ,data
来保存 DataGrid 的项目。请注意,我们必须通过该方法附加dataGrid
到。data
addDataDisplay
ListDataProvider data;
public void onModuleLoad() {
// build grid:
DataGrid dataGrid = new DataGrid();
BuildColumns(dataGrid);
dataGrid.setWidth("300px");
dataGrid.setHeight("300px");
// add items:
data = new ListDataProvider();
for(int i = 1; i < 25; i++){
data.getList().add(new Item("Item " + i, i));
}
data.addDataDisplay(dataGrid);
// display:
RootPanel.get().add(dataGrid);
}
构建数据网格:
此私有方法用于构建 DataGrid 的列。delCol
在用于侦听按钮列的单击事件的 FieldUpdater 内部,我们从 中删除相应的项目data
,并调用data.refresh()
以更新 DataGrid 显示。
private void BuildColumns(DataGrid dataGrid){
Column textCol = new Column(new SafeHtmlCell()) {
@Override
public SafeHtml getValue(Item object) {
SafeHtmlBuilder sb = new SafeHtmlBuilder();
sb.appendEscaped(object.text);
return sb.toSafeHtml();
}
};
dataGrid.addColumn(textCol);
dataGrid.setColumnWidth(textCol, 75, Unit.PCT);
Column deleteCol = new Column(new ButtonCell()) {
@Override
public String getValue(Item object) {
return "Delete " + object.value;
}
};
deleteCol.setFieldUpdater(new FieldUpdater() {
@Override
public void update(int index, Item object, String value) {
data.getList().remove(index);
data.refresh();
}
});
dataGrid.addColumn(deleteCol);
}
我将此代码放在一个新的 GWT 项目中并对其进行了测试。删除行时 DataGrid 不滚动。