【问题标题】:p:column sortBy value expresson not evaluating to column indexp:column sortBy value 表达式不评估列索引
【发布时间】:2019-02-25 11:14:54
【问题描述】:

我在包含固定列和动态列的惰性数据表的固定列中遇到 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 上调用排序,一切都很好。 sortBy 值表达式:#{record[column.columnIndex]} 计算为列索引并且排序正常。 而如果我在固定列上调用排序,比方说第一个,值表达式#{record[0]} 不会计算为列索引 0,而是一个字符串“记录 [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

【问题讨论】:

    标签: primefaces


    【解决方案1】:

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

    所以有两个sloutions:

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

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

    第二种解决方案更整洁。希望这能启发其他犯同样错误的人。

    【讨论】:

      猜你喜欢
      • 2017-02-09
      • 2016-07-26
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多