[英]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
使用value和filteredValue onchange=PF('freeRoomsTable').filter()
,而不使用p:selectCheckboxMenu
子p:ajax
元素 p:selectCheckboxMenu
value
属性,例如value="#{someBean.selectedItems}"
private String[] selectedItems
,以及getter和setter 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.