【问题标题】:Skip some row in jsf dataTable跳过 jsf dataTable 中的某行
【发布时间】:2010-05-28 16:02:49
【问题描述】:

如何使用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>

&lt;/h:dataTable&gt;

我想展示所有狗,但年龄超过 10 岁的狗。 dog.age > 10.

我正在使用 Seam。

【问题讨论】:

    标签: jsf components seam


    【解决方案1】:

    你不能在视图侧很好地做到这一点。您最多可以将每个单元格内容的rendered 属性设置为false,但这并不能避免&lt;tr&gt; 元素被渲染。您会看到一个空白行,并且它的外观在浏览器中可能不一致。

    最好是在(post)construct,action(listener)中预先过滤行,或者在getter中延迟过滤。

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

    或者,只需发送一个新的 SQL 查询,准确返回您需要的数据。

    【讨论】:

    • 一段不错的代码。它回答了我最初的问题。 jsf dataTable 不允许对每个元素进行任何类型的过滤。
    • 这有问题。我的collection其实是一个List,这个filter方法返回一个Collection(过滤后的collection实现),现在把它强制转换成list显然是失败的。
    • 天啊,已修复。但是我想知道 Google 收藏中的 Lists#filter() 在哪里?
    • 由于 transform() 在 Lists 包中,我猜 Lists 过滤器还没有实现。您的新代码是正确的,但现在新分配:S
    • 是的,算了。自己循环一遍。
    【解决方案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>
    

    希望对你有帮助。

    塞萨尔。

    【讨论】:

    • 很好,我从没想过扩展现有的渲染器。这是一个老问题,该项目现已完成,因此找到了 BalusC 提供的工作。不过感谢这个解决方案。下次我在工作中执行 Seam 开发任务时,我一定会尝试一下。
    猜你喜欢
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2012-12-01
    • 2011-12-20
    • 1970-01-01
    • 2018-11-09
    • 2011-01-09
    • 1970-01-01
    相关资源
    最近更新 更多