在jsf dataTable中跳过一些行

时间:2010-05-28 16:02:50

标签: jsf components seam

如何使用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&gt; 10。

我正在使用Seam。

2 个答案:

答案 0 :(得分:5)

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

最好是在(post)构造,动作(监听器)中预先过滤行,或者在getter中懒惰地过滤行。

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

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

答案 1 :(得分:2)

您可以为数据表编写自己的渲染器。例如,我使用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>

我希望它有所帮助。

塞萨尔。