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.
精彩评论