【问题标题】:datatable returns a null selected object if it is filtered primefaces 5.0如果它被过滤primefaces 5.0,数据表返回一个空的选定对象
【发布时间】:2017-07-30 18:22:27
【问题描述】:

希望有人能给我这个案例的提示,在发布这个问题之前搜索了很多,但没有运气。

我有一个只允许选择单行的数据表(一次可能包括 200 行),在选择一个后,commandButton 会将用户重定向到新表单以显示一些信息。

当用户首先在数据表中的任何给定列上应用过滤器,选择一行并单击命令按钮时,问题就出现了,我的支持 bean (@ViewScoped) 没有接收到选定的对象 (null)

由于表格比较大,这里只贴一部分展示Datatable结构:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:fn="http://java.sun.com/jsp/jstl/functions">

    <h:body >   
        <h:form id="Form1"> 

                <p:outputPanel id="ID1">
                    .
                    .
                    .
                    <table cellpadding="4" cellspacing="4" border="0" style="width: 100%;">
                    <tr> 
                        <td><b><big><big><font face="Arial" >#{beanD.MenuTitle} > List of records </font></big></big></b></td>
                        <td>
                            <b><big><font face="Arial"><p:outputLabel value="|" /></font></big></b>
                        </td>
                        <td style="width: 150px;">
                            <p:commandButton style="font-family:Arial;font-size: 13px;" icon="ui-icon-check" value="Open Record" ajax="false" 
                                         actionListener="#{MBR.Method1(2,MBR.var1.cod,MBR.var1.codS)}" action="#{beanD2.url_Menu('FormRedirected')}"/>
                        </td>
                    </tr>
                    </table>

                    <table cellpadding="4" cellspacing="4" border="0">
                        <tr>
                            <td>                      
                                <p:dataTable  var="Rad" selectionMode="single" value="#{MBSg.list}" 
                                              id="RSTable"  widgetVar="RS"  selection="#{MBR.var1}" rowKey="#{Rad.codS}"
                                              style="font-family: Arial;font-size: 12px; height: 320px;" emptyMessage="No Records" 
                                              scrollable="true" scrollHeight="100%;" frozenColumns="1" styleClass="FirstCol" >
                                    <p:column headerText="Header1"  filterStyle="font-family:Arial;font-size: 12px;width:60px;" filterBy="#{Rad.field1}" filterMatchMode="contains"  style="font-family:Arial;font-size: 12px;width: 60px;">
                                        <h:outputText value="#{Rad.field1}" />
                                    </p:column>
                                    <p:column headerText="Header2" filterBy="#{Rad.field2}" filterMatchMode="contains" style="font-family:Arial;font-size: 12px;width: 250px;">
                                        <h:outputText value="#{Rad.field2}" />
                                    </p:column>
                                    <p:column headerText="Header3"  filterBy="#{Rad.field3}#{Rad.entidades}" filterMatchMode="contains" style="font-family:Arial;font-size: 12px;width: 900px;">
                                        <h:outputText value="#{Rad.field3}" />
                                    </p:column>
                                    <p:column headerText="Header4" filterBy="#{Rad.field4}" filterMatchMode="contains" style="font-family:Arial;font-size: 12px;width: 100px;">
                                        <h:outputText value="#{Rad.field4}" />
                                    <p:column headerText="Header5"  filterStyle="font-family:Arial;font-size: 12px;width:70px;"  filterBy="#{Rad.field5}" filterMatchMode="contains" style="font-family:Arial;font-size: 12px;width: 120px;">
                                        <h:outputText value="#{Rad.field5}" />
                                    </p:column>                                                            

                                </p:dataTable>
                            </td>
                        </tr>
                    </table>
                </p:outputPanel>
        </h:form>
    </h:body>
</html>

这是我的支持 bean (MBR) 中评估用户所做选择的方法(存储在变量 var1 中)

@ManagedBean(name = "MBR")
@ViewScoped
public class BeanR {
.
.
public void Method1(int proc, int num, int num_s) {
        try {

            if (var1 == null) {
                mbT.setMens("No item Selected");
                mbT.warn();
                mbT.resetTable("Form1:RSTable");
                ..."some other operations performed"
            } else {
                Method2(proc, num, num_s);
            }
        } catch (ParseException e) {
            mbT.setMens("Error in MBR : '" + this.getClass() + ".Method1()' caused by: " + e.getMessage());
            mbT.error();
        }

    }
}

如前所述,如果在过滤后进行选择(然后单击 commandButton),则会在我的 bean 中启动此消息:mbT.setMens("No item Selected");

顺便说一句,过滤效果很好,根本没有问题。

应用程序是使用 Primefaces 5.0 开发的,目前没有机会升级

任何解决方法都将不胜感激,我已经用谷歌搜索并阅读了 PrimeFaces 展示,但没有找到任何答案,

最好的问候。

最后更新:

经过大量测试后,我发现 DataTable 的属性 frozenColumns 是在过滤表时导致这种奇怪行为的原因。希望任何 StackOverflow 方面的专家都可以让我们更深入地了解其背后的原因。

根据我的问题,删除属性后数据表工作正常。希望以后有人会觉得这很有用。

【问题讨论】:

  • 您是否尝试添加 ajax 事件?!?你也对你的var1进行了初始化
  • Yagami 感谢您的回复。当然, var1 是在表单加载时初始化的。我尝试了一种使用我的数据表中包含的 的方法. Debuggin 我发现只要选择了一行(带或不带过滤器)就会触发 ajax 事件,但如果先前过滤了数据表,则 var1 也会变为空。有什么线索吗?
  • 尝试将它作为参数发送我相信它会起作用看看这个例子How do you pass a value into an ajax listener primefaces
  • 您必须将您的 var 从数据表发送到一个对象(与 var 相同),它会保存它告诉我您是否需要更多信息
  • 不走运@Yagami !相同的行为。这有点棘手:(

标签: primefaces datatable


【解决方案1】:

在 p:dataTable 组件上添加一个 rowKey 作为属性。

<p:dataTable value="#{myBean.cars}" var="car" rowKey="#{car.id}">
  ...
<p:dataTable>

【讨论】:

    【解决方案2】:

    我遇到过类似的问题,最后发现我错过了dataTable标签中的filteredValue属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-21
      • 2022-07-22
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多