当前位置: 首页 > 面试题库 >

Vaadin 8.5.1-行更新后刷新网格

董高畅
2023-03-14
问题内容

我正在使用Vaadin 8.5.1网格来显示1000行。一旦使用属性的更改更新了行,我将使用
grid.getDataProvider().refreshItem(selectedRow)
grid.getDataProvider().refreshAll()无法更新行。

我需要显式grid.setItems()查看该行的更新属性。

我正在使用下面的代码片段来创建网格

    msgGrid = new ABSMsgGrid();

    List<ConsoleEntry> messageEntryList = new ArrayList<>();
    if (inputConsole != null) {
        messageEntryList.addAll(inputConsole.getMessageEntryList());
    }

    msgGridDataProvider = new ListDataProvider<ConsoleEntry>(messageEntryList) {

        @Override
        public Object getId(ConsoleEntry item) {
            return item.getId();
        }
    };

    msgGrid.setDataProvider(msgGridDataProvider);



//on changing property of the grid row, i use the below snippet
private void handleHideRowMenuItem(GridContextMenu<ConsoleEntry> contextMenu, ConsoleEntry selectedConsoleItem) {
        if (!selectedConsoleItem.isHidden()) {
            hideRowMenuItem = contextMenu.addItem("Hide Row", VaadinIcons.EYE_SLASH, selectedMenuItem -> {
                    selectedConsoleItem.hide();
                    **msgGridDataProvider.refreshItem(selectedConsoleItem);**
                }
            });
        }
}

public class ConsoleEntry {

        @Override
        public boolean equals(Object obj) {
            // TODO Auto-generated method stub
            if (obj instanceof ConsoleEntry) {
                ConsoleEntry temp = (ConsoleEntry) obj;
                String msgRef2 = temp.getMsgRef();
                return this.getMsgRef().equalsIgnoreCase(msgRef2);
            }
            return false;
        }

        @Override
        public int hashCode() {
            // TODO Auto-generated method stub
            return super.hashCode();
        }

        public String getId(){
            return this.getMsgRef();
        }
}

欣赏是否有人可以分享有关如何解决此问题的指针

TIA


问题答案:

为了使一个项目被视为同一项目(以及刷新工作),您需要在该对象上正确实现equals()hashCode()方法。

从文档中

公共无效refreshItem(T项目)

从接口:DataProvider复制的描述

刷新给定的项目。此方法应用于通知所有DataProviderListener某项已被更新或被新实例替换。

为了使其正常工作,该项目必须执行

应该实现DataProvider.getId(Object)以返回适当的标识符。

除此之外,您还应该创建一个ListDataProvider,将其分配给网格,然后通过先前分配的相同实例进行更新ListDataProvider



 类似资料:
  • 问题内容: 我用数据库中的数据创建简单的网格: 要编辑每一行,请创建按钮: 这会打开带有编辑表单的新窗口。接受所有更改后,我必须手动刷新整个页面才能看到Grid上的修改。我的问题是: 修改任何行条目后如何只刷新Grid?以及如何将那些修改保存到数据库中(也许beanItemContainer可以做到)? 问题答案: 这是一个错误。在基础容器中进行更改后,Grid不会更新自身,也没有任何合理的刷新方

  • 问题内容: 众所周知,在使用hibernate模式(甚至在HQL中)对数据库进行批量更新时,所做的更改不会复制到当前会话中存储的实体中。 因此,我可以调用session.refresh将修改内容加载到我的会话实体中。 我们经常调用flush将修改发送到数据库,但是文档说它“同步”了会话和数据库。 这是否意味着flush能够为我的会话实体设置良好的新db值?否则flush最终将使用存储在实体中的旧数

  • 问题内容: 我有一个pageLoad函数,该函数在无法更改的.ascx控件上设置一些CSS。在页面加载时,一切都很好,但是当更新面板更新控件时,不再应用我的CSS。页面更新后如何重新运行功能? 显然,这仅在初始页面加载时运行。更新后如何运行? 问题答案: 添加add_pageLoaded处理程序也可以。 注意:处理程序将为任何回调触发,但是您可以在需要调用函数时使用过滤器。

  • 对Powershell很陌生,希望有人能给我指明正确的方向。我想知道是否有一个更干净的方法来完成我下面的工作?如果我对第一次Get-ChildItem调用时返回的文件(存储在$items变量中)做了一些更改,那么有没有一种方法可以刷新到Get-ChildItem的内容? 在第一个foreach语句中,我为返回的所有文件创建一个日志签名。一旦那样做了,我需要做的是;再次获取列表(因为路径中的项已经更

  • 我有剑道网格和自定义搜索表单。在我的搜索表单中,我有提交和重置按钮。如果有搜索内容,那么网格将使用搜索的过滤器数据源进行更新,然后单击“重置”,网格将使用新数据源进行刷新。如果我将pagesize值10更改为20并单击“重置网格”,我的问题是没有重置。。然后网格页面大小变为20到10。。。如果单击“下一页”,则第二页的页面大小保持为20,第一页的页面大小保持为10 我怎么解决这个问题?任何想法?我

  • 有没有一种方法可以在不刷新整个数据源或使用jQuery为每个单元格设置值的情况下刷新单个剑道网格行?