在固定和动态列混合的惰性数据表的固定列中,sortBy出现问题。这是表格:
<p:dataTable id="table" value="#{formController.lazyModel}" var="record" rowKey="#{record.get(0)}" widgetVar="tableWidget"
lazy="true" selection="#{formController.selectedRecord}" selectionMode="single" style="#{formController.tableStyle} min-width: 120px;"
scrollable="true" scrollHeight="600" scrollWidth="100%" emptyMessage="#{sessionController.itemFormLabels['table_no_entries_msg']}" editable="true"
paginator="true" rows="50" rowsPerPageTemplate="25,50,100" paginatorPosition="bottom" filterDelay="500"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}">
<p:ajax event="rowEdit" listener="#{formController.onRowEdit}" update=":alowAddNewRecord :formTableForm:buttonPanel" />
<p:ajax event="rowEditCancel" onsuccess="cancelEditing();" />
<p:ajax event="page" onstart="blockTableInput();" oncomplete="enbleTableInput();" />
<f:facet name="header">
<p:commandButton id="insertButton" value="#{sessionController.itemFormLabels['add_record_button']}" icon="fa fa-plus"
actionListener="#{formController.insertRecord}" disabled="#{not formController.alowAddNewRecord}"
title="#{sessionController.itemFormLabels['add_record_tip']}" onclick="saveLastRow();PF('tableWidget').clearFilters();"
update=":alowAddNewRecord :formTableForm:table :formTableForm:buttonPanel :growlMessages" />
</f:facet>
<p:column headerText="ID" sortBy="#{record[0]}" filterBy="#{record[0]}" filterMatchMode="contains" exportable="false"
style="width: 50px; font-size: 12px !important;" rendered="#{formController.formColumnList.get(0).visible}">
...
</p:column>
<p:columns var="column" value="#{formController.columnsInfo}" columnIndexVar="colIndex" exportable="false"
sortBy="#{record[column.columnIndex]}" filterBy="#{record[column.columnIndex]}" filterMatchMode="contains"
rendered="#{formController.formColumnList.get(column.columnIndex).visible}"
filterStyle="width: 90%" style="#{formController.columnsCustomStyles.get(column.columnIndex - 1)} font-size: 12px !important;">
...
</p:columns>
<p:column headerText="report header" sortBy="#{record[formController.noColumns + 1]}" exportable="false"
filterBy="#{record[formController.noColumns + 1]}" filterMatchMode="contains" style="width: 50px; font-size: 12px !important;"
rendered="#{formController.tableInfo.tableType eq 1 and formController.formColumnList.get(formController.noColumns + 1).visible}">
...
</p:column>
<p:column headerText="user created" sortBy="#{record[formController.noColumns + formController.factColDelta + 1]}" exportable="false"
filterBy="#{record[formController.noColumns + formController.factColDelta + 1]}" filterMatchMode="contains"
style="width: 100px; font-size: 12px !important;" rendered="#{formController.formColumnList.get(formController.noColumns + formController.factColDelta + 1).visible}">
...
</p:column>
<p:column headerText="date created" sortBy="#{record[formController.noColumns + formController.factColDelta + 2]}" exportable="false"
filterBy="#{record[formController.noColumns + formController.factColDelta + 2]}" filterMatchMode="contains"
style="width: 100px; font-size: 12px !important;" rendered="#{formController.formColumnList.get(formController.noColumns + formController.factColDelta + 2).visible}">
...
</p:column>
<p:column headerText="user modified" sortBy="#{record[formController.noColumns + formController.factColDelta + 3]}" exportable="false"
filterBy="#{record[formController.noColumns + formController.factColDelta + 3]}" filterMatchMode="contains"
style="width: 100px; font-size: 12px !important;" rendered="#{formController.formColumnList.get(formController.noColumns + formController.factColDelta + 3).visible}">
...
</p:column>
<p:column headerText="date modified" sortBy="#{record[formController.noColumns + formController.factColDelta + 4]}" exportable="false"
filterBy="#{record[formController.noColumns + formController.factColDelta + 4]}" filterMatchMode="contains"
style="width: 100px; font-size: 12px !important;" rendered="#{formController.formColumnList.get(formController.noColumns + formController.factColDelta + 4).visible}">
...
</p:column>
<p:column style="width:32px" exportable="false">
<p:rowEditor />
</p:column>
如果我在动态Cloumns上调用sort,一切都很好。 sortBy值表达式:#{record[column.columnIndex]}
计算为列索引,并且排序正常。
而如果我在固定列上调用sort,那么假设第一个列的值表达式#{record[0]}
的计算结果不是列索引0,而是字符串'record [0]'。
这可以在调用排序时抛出的NumberFromatException中看到:
12:09:52,336严重[javax.enterprise.resource.webcontainer.jsf.application](默认任务1)呈现视图时出错[/public/item_form.xhtml]:java.lang.NumberFormatException:对于输入字符串: “记录[0]” 在java.base / java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
我正在使用Primefaces 6.2
答案 0 :(得分:0)
我弄清楚了我出了错的地方。我已经实现了一个惰性表,并且这样做时,负责编写自己的惰性模型类,该类扩展了LazyDataModel
类,该类也负责排序和过滤。我已经完全完成了所需的工作,但是我忘记了实现非动态列的处理。
因此有两种选择:
用我的静态列(列表中的位置,数据类型等)的信息增强我的惰性类,并添加用于对这些列进行排序和过滤的特定实现。
将我的静态列添加到p:columns
标记中呈现的列表中(即,放弃非动态列),并将静态样式的列样式和其他信息添加到相应的描述列表中动态列。这样一来,不必在懒惰的数据模型中添加特定于实现的代码。
第二种解决方案是更干净更整洁。希望这能启发其他犯过与我相同的错误的人。