Пропустить строку в jsf dataTable - PullRequest
1 голос
/ 28 мая 2010

Как пропустить несколько строк, которые будут отображаться с помощью 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.

Я использую Шов.

Ответы [ 2 ]

5 голосов
/ 28 мая 2010

Вы не можете сделать это красиво в виде обзора. Вы можете максимально установить атрибут rendered содержимого каждой ячейки на false, но это не мешает отображению элемента <tr>. Вы можете увидеть пустую строку, и ее внешний вид может быть непоследовательным среди браузеров.

Лучше всего предварительно фильтровать строки в конструкции (post), action (listener) или, возможно, лениво в геттере.

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

Или просто отправьте новый запрос SQL, возвращающий именно те данные, которые вам нужны.

2 голосов
/ 14 июня 2011

Вы можете написать свой собственный рендер для обработки данных. Например, я использую 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>

Надеюсь, это помогло.

Сезар.

...