繁体   English   中英

如何使用p:selectCheckboxMenu过滤带有selectionMode的ap:dataTable?

[英]How to filter a p:dataTable with selectionMode with p:selectCheckboxMenu?

我正在尝试在一个列标题中使用Primefaces组件p:selectCheckboxMenu过滤p:dataTable 但是,这不能按预期工作。 数据表上的其他过滤器也可以正常工作,例如输入字段。 有问题的列是Room type ,其具有p:selectCheckboxMenu

筛选一次 ,在selectCheckbox菜单上的选中或取消选中复选框不会在表上添加或删除任何筛选之后,该筛选就会起作用。

这是关于这个问题的有趣一点:

如果我从datatable删除selectionMode="single"属性,则即使在第一个checkBox切换后,排序仍然有效。 像在其中一样,我可以切换和取消切换框,并且p:dataTable会被相应地过滤。 但是,我这里需要选择模式,因为我应该能够选择一行并通过单击来导航到另一个视图。 datatable上没有selectionMode属性时,这将不起作用。

这是我的数据表:

<div class="background">

        <div class="freeRoomsContent">

            <br/>
            <p:outputLabel value="free rooms" styleClass="headerfont"/>
            <br/>
    <h:form id="freeRoomsForm">
        <p:dataTable id="freeRoomsTable" var="room" paginatorPosition="bottom" paginatorAlwaysVisible="false"
                     value="#{freeRoomsController.freeRoomsList}" selectionMode="single" selection="#{freeRoomsController.room}"
                     rowKey="#{room.roomId}" widgetVar="freeRoomsTable"
                     paginator="true" rows="20" pageLinks="5" scrollable="false"
                     paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                     rowsPerPageTemplate="20,50,100" skipChildren="true" emptyMessage="No free rooms available.">
            <p:ajax event="rowSelect" listener="#{freeRoomsController.onRowSelect}" />
            <p:column headerText="Room Id" sortBy="#{room.roomId}" filterMatchMode="contains" filterBy="#{room.roomId}">
                <h:outputText value="#{room.roomId}"/>
              </p:column>

            <p:column headerText="Room number" sortBy="#{room.roomNumber}" filterMatchMode="contains" filterBy="#{room.roomNumber}">
                <h:outputText value="#{room.roomNumber}" />
            </p:column>
<!-- other similar columns -->

            <p:column headerText="Room type" filterMatchMode="exact" filterBy="#{room.roomType}">
                <f:facet name="filter">
                    <p:selectCheckboxMenu  onchange="PF('freeRoomsTable').filter()"
                                     label="Room type">
                        <f:selectItems value="#{staticData.roomTypes}" var="rt" itemLabel="#{msg[rt.name]}" itemValue="#{rt.name}"
                                       />
                    <p:ajax event="change" process="@this" update="freeRoomsForm" />
                    <p:ajax event="toggleSelect" process="@this" update="freeRoomsForm" />
                    </p:selectCheckboxMenu>
                </f:facet>
                <h:outputText value="#{msg[room.roomtype.name]}">
                    <f:convertDateTime pattern="dd.MM.yyyy" />
                </h:outputText>
            </p:column>

<!-- normal input field columns that work -->

        </p:dataTable>
    </h:form>
</div>
</div>

这为我工作:

  • p:dataTable使用valuefilteredValue

  • 仅使用onchange=PF('freeRoomsTable').filter() ,而不使用p:selectCheckboxMenup:ajax元素

  • 设置p:selectCheckboxMenu value属性,例如value="#{someBean.selectedItems}"

  • 在您的bean中,使用private String[] selectedItems ,以及getter和setter

  • 在您的bean实现中, filterFunction中 ,此示例方法仅需要使用签名布尔值(Object,Object,Locale) ,仅使用第一个参数(Object值):

     public boolean filterFunction(Object value, Object filter, Locale locale) { // instanceof checking probably not needed if (value == null || !(value instanceof String)) { return true; } String valueInRow = (String)value; // if nothing is selected, show row in table ie return true, // you can play with this ofcourse if (selectedItems == null || selectedItems.length == 0) { return true; } // if item in row matches any of the items that were selected in header, // show in table ie return true for (int i = 0; i < selectedItems.length; i++) { if (selectedItems[i].equals(valueInRow)) { return true; } } // if you don't want to show row in table, return false return false; } 

  • p:column ,调用filterfunction=#{someBean.filterFunction} -没有参数,没有括号,无需使用任何filterMatchMode ,仅保留filterBy

  • 暂无
    暂无

    声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

     
    粤ICP备18138465号  © 2020-2024 STACKOOM.COM