开发者

Skip some row in jsf dataTable

How to skip some rows to be displayed using 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">开发者_Go百科

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

</h:dataTable>

I want to display all dogs, but those how have an age greater than 10. dog.age > 10.

I'm using Seam.


You can't do this nicely in the view side. You can at most set the rendered attribute of every cell contents to false, but this doesn't avoid the <tr> element being rendered. You would see a blank row and its appearance may not be consistent among browsers.

Best is to filter the rows beforehand in the (post)construct, action(listener) or maybe lazily in the getter.

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

Or, just send a new SQL query returning exactly the data you need.


You can write your own renderer for datatable. For example, I use richfaces and I have the folowing renderer:

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);
    }
}

and I registered my renderer as

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

I hope it helped.

Cesar.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜