微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

BeanItemContainer 唯一属性值

如何解决BeanItemContainer 唯一属性值

我的网格使用 BeanItemContainer。我想获得其中一个属性的唯一列表。例如,假设我的 bean 如下:

class Fun {
     String game;
     String rules;
     String winner;
}

这将在我的网格中显示为 3 列。我想获取 game 属性的所有唯一值的列表。我该怎么做?我在多个不同的 bean 类中有相同的属性 id,所以直接从 BeanItemContainer 获取值会很好。我试图避免在将数据加载到网格之前构建这个唯一列表,因为这样做需要我逐案处理。

我的最终目标是根据这些唯一值在过滤器中创建一个下拉列表。

解决方法

没有任何帮助可以直接执行您的要求。相反,您必须通过遍历所有项目并将属性值收集到 Set 中,然后在最后包含所有唯一值来“手动”执行此操作。

或者,如果数据来自数据库,那么您可以使用例如从那里检索唯一值SQL 中的 DISTINCT 关键字。

,

如果有人好奇,这就是我应用 Leif 建议的方式。当他们进入下拉列表时,我会遍历我关心的列的属性 id 的所有项目 id,然后根据该属性 id 填充值。由于相同的 Grid 可以加载新数据,因此我还必须“清除”此项目 ID 列表。

        filterField.addFocusListener(focus->{
            if(!(filterField.getItemIds() instanceof Collection) ||
                    filterField.getItemIds().isEmpty())
            {
                BeanItemContainer<T> container = getGridContainer();

                if( container instanceof BeanItemContainer && getFilterPropertyId() instanceof Object )
                {
                    List<T> itemIds = container.getItemIds();
                    Set<String> distinctValues = new HashSet<String>();
                    
                    for(T itemId : itemIds)
                    {
                        Property<?> prop = container.getContainerProperty(itemId,getFilterPropertyId());
                        String value = null;

                        if( prop.getValue() instanceof String )
                        {
                            value = (String) prop.getValue();
                        }
                        
                        if(value instanceof String && !value.trim().isEmpty())
                            distinctValues.add(value);
                    }
                    
                    filterField.addItems(distinctValues);
                }
            }
        });

次要问题:filterField 变量正在使用 Vaadin 7 的 ComboBoxMultiselect 附加组件。希望当我终于有时间转换到 Vaadin 14+ 时,我可以在那里做类似的事情。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。