2010-05-28 49 views
1

一些列如何跳过一些行使用dataTable中显示:跳过在JSF的dataTable

<h:dataTable cellspacing="0" id="dogs" value="#{dogBean.dogs}" var="dog" rendered="#{dogBeans.dogs != null}">

<h:column id="nameColumn"> 

    <h:outputText value="#{dog.name}"/> 
</h:column> 

<h:column id="breedColumn"> 

    <h:outputText value="#{dog.breed}"/> 
</h:column> 

</h:dataTable>

我想显示所有的狗,但这些怎么有年龄大于10. dog.age> 10.

我正在使用Seam。

回答

5

你不能在视图方面做得很好。您最多可以将每个单元格内容的rendered属性设置为false,但这不会避免呈现<tr>元素。你会看到一个空行,它的外观可能在浏览器中不一致。

最好是事先在(后)构造,动作(侦听器)中过滤行或者可能在过滤器中过早地过滤行。

List<Dog> dogsOlderThan10 = new ArrayList<Dog>(); 
for (Dog dog : dogs) { 
    if (dog.getAge() > 10) dogsOlderThan10.add(dog); 
} 

或者,只需发送一个新的SQL查询,返回所需的数据。

+0

好的一段代码。它回答了我最初的问题。 jsf dataTable不允许在每个元素上进行任何类型的过滤。 – Marc 2010-05-28 16:56:12

+0

虽然这个问题。我的集合实际上是一个List,并且此过滤器方法返回一个Collection(已过滤的集合实现),现在将其转换为列表显然失败。 – Marc 2010-05-28 17:07:52

+0

啊,geez,固定。然而,我想知道Google Collections中的Lists#filter()在哪里? – BalusC 2010-05-28 17:16:36

2

您可以为datatable编写自己的渲染器。例如,我使用RichFaces和我有如下因素渲染:

public class DetailDataTableRenderer extends DataTableRenderer { 

    @Override 
    public void encodeOneRow(FacesContext context, TableHolder tableHolder) throws IOException { 
     Object obj = tableHolder.getTable().getRowData(); 
     if (obj instanceof BasicDTO) { 
      BasicDTO dto = (BasicDTO)obj; 
      if (dto.isSkipRow()) { 
       return; 
      } 
     } 
     super.encodeOneRow(context, tableHolder); 
    } 
} 

和我登记我的渲染器作为

<renderer> 
    <component-family>org.richfaces.DataTable</component-family> 
    <renderer-type>org.richfaces.DataTableRenderer</renderer-type> 
    <renderer-class>myframework.view.component.DetailDataTableRenderer</renderer-class>  
</renderer> 

我希望它帮助。

塞萨尔。

+0

请格式化并缩进代码。谢谢! – Trufa 2011-06-14 17:50:30

+0

不错,我从未想过扩展现有的渲染器。这是一个古老的问题,该项目现在已经完成,因此找到了由BalusC提供的工作。尽管感谢这个解决方案。我将在下次尝试使用Seam开发任务时尝试它。 – Marc 2011-06-20 22:31:22