p:列sortBy值表示不评估列索引

时间:2019-02-25 11:14:55

标签: primefaces

在固定和动态列混合的惰性数据表的固定列中,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

1 个答案:

答案 0 :(得分:0)

我弄清楚了我出了错的地方。我已经实现了一个惰性表,并且这样做时,负责编写自己的惰性模型类,该类扩展了LazyDataModel类,该类也负责排序和过滤。我已经完全完成了所需的工作,但是我忘记了实现非动态列的处理。

因此有两种选择:

  1. 用我的静态列(列表中的位置,数据类型等)的信息增强我的惰性类,并添加用于对这些列进行排序和过滤的特定实现。

  2. 将我的静态列添加到p:columns标记中呈现的列表中(即,放弃非动态列),并将静态样式的列样式和其他信息添加到相应的描述列表中动态列。这样一来,不必在懒惰的数据模型中添加特定于实现的代码。

第二种解决方案是更干净更整洁。希望这能启发其他犯过与我相同的错误的人。