BeanItemContainer 唯一 属性 值
BeanItemContainer unique property values
我正在为我的网格使用 BeanItemContainer。我想获得其中一个属性的唯一列表。例如,假设我的豆子如下:
class Fun {
String game;
String rules;
String winner;
}
这将在我的网格中显示为 3 列。我想获取 game
属性 的所有唯一值的列表。我该怎么做?我在多个不同的 bean 类 中有相同的 属性 id,所以直接从 BeanItemContainer 获取值会很好。我试图避免在将数据加载到网格之前构建这个唯一列表,因为这样做需要我根据具体情况进行处理。
我的最终目标是根据这些唯一值在过滤器中创建下拉菜单。
没有任何助手可以直接按照您的要求进行操作。相反,您必须通过遍历所有项目并将 属性 值收集到 Set
来“手动”执行此操作,然后最后包含所有唯一值。
或者,如果数据来自数据库,那么您可以使用例如从数据库中检索唯一值SQL.
中的 DISTINCT
关键字
如果有人好奇,这就是我应用 Leif 的建议的方式。当他们进入下拉列表时,我循环浏览我关心的列的 属性 id 的所有项目 id,然后根据该 属性 id 填充值。由于同一个网格可以加载新数据,我也必须“清除”这个项目 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+ 时,我可以在那里做类似的事情.
我正在为我的网格使用 BeanItemContainer。我想获得其中一个属性的唯一列表。例如,假设我的豆子如下:
class Fun {
String game;
String rules;
String winner;
}
这将在我的网格中显示为 3 列。我想获取 game
属性 的所有唯一值的列表。我该怎么做?我在多个不同的 bean 类 中有相同的 属性 id,所以直接从 BeanItemContainer 获取值会很好。我试图避免在将数据加载到网格之前构建这个唯一列表,因为这样做需要我根据具体情况进行处理。
我的最终目标是根据这些唯一值在过滤器中创建下拉菜单。
没有任何助手可以直接按照您的要求进行操作。相反,您必须通过遍历所有项目并将 属性 值收集到 Set
来“手动”执行此操作,然后最后包含所有唯一值。
或者,如果数据来自数据库,那么您可以使用例如从数据库中检索唯一值SQL.
中的DISTINCT
关键字
如果有人好奇,这就是我应用 Leif 的建议的方式。当他们进入下拉列表时,我循环浏览我关心的列的 属性 id 的所有项目 id,然后根据该 属性 id 填充值。由于同一个网格可以加载新数据,我也必须“清除”这个项目 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+ 时,我可以在那里做类似的事情.