[英]Remove a row in a GWT Datagrid without scrolling to the top of the grid
我有一個數據網格,每頁可能會顯示很多行。 假設我每頁顯示25行。 然而,網格的可視區域僅為10行。 即整個網格只有400px,每行為40px。 所以網格上有一個滾動條。
當我刪除網格中的單行時,網格會自動移動到網格中的第一行。 如果我滾動了底部並刪除了最后一行,我再次移動到第一行。
我曾嘗試過多種方法來解決這個問題,但我找不到一種能夠按照我想要的方式運行的解決方案。
我嘗試使用scrollIntoView()方法將刪除行之前或之后的行直接滾動到視圖中。
我已經嘗試弄清楚在刪除之前如何確定哪些行在可見范圍內,但是getVisibleRange()方法與頁面范圍相關,而不是實際顯示的范圍。
我在網上搜索過這個,看起來我是唯一有這個問題的人。 我錯過了什么?
我有同樣的問題,我發現如果dataGrid有keyboardSelectionPolicy =“BOUND_TO_SELECTION”,則會發生錯誤
如果使用ListDataProvider來管理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的項目。 注意,我們必須通過addDataDisplay
方法將dataGrid
附加到data
。
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的delCol
內部,我們從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不會滾動。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.