如何解决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 举报,一经查实,本站将立刻删除。