【问题标题】:Primefaces dataTable with checkbox not work带复选框的 Primefaces 数据表不起作用
【发布时间】:2013-11-27 11:07:36
【问题描述】:

我正在使用带有 jsf2.2 的 Primefaces 4.0。

当我使用带有复选框的 dataTable 时,只要我选择记录,它就不会发回任何记录。

点击复选框后,它应该会发回记录。

我删除了多余的东西并使我的代码易于测试:

每秒有一个轮询打印选定的项目,以便我可以检查是否有东西发回。

在这样做之后,我发现没有任何东西被退回。 这是我的代码:

页面:

<h:head>
    <title>System Monitor</title>

</h:head>

<h:body>
    <h:form>
        <p:poll interval="1" listener="#{indexBean.printSelect()}"/> 
    </h:form> 

    <h:form>     

        <p:dataTable id='data' var="proc" value="#{indexBean.procStatus}"
                     rowKey="#{proc.pid}" selection="#{indexBean.selectedProcs}">
            <p:column>
                <f:facet name='header'>
                    <h:outputText value='Process Name'/>
                </f:facet>
                <h:outputText styleClass="outputCell" id="pname" value='#{proc.name}'/>
            </p:column>
            <p:column selectionMode="multiple"/>
        </p:dataTable>

    </h:form>
</h:body>

支持 Bean:

@ManagedBean(name = "indexBean")
@ViewScoped
public class indexBean implements Serializable {
private ProcStatDataModel procStatus;
private SingleProcess[] selectedProcs;

@PostConstruct
public void loadProcStat() {
    List<SingleProcess> temp = new ArrayList<>();
    temp.add(new SingleProcess("test1"));
    temp.add(new SingleProcess("test2"));
    temp.add(new SingleProcess("test3"));
    procStatus = new ProcStatDataModel(temp);
}

public void printSelect() {
    if (selectedProcs != null) {
        String str = "";
        for (SingleProcess sp : selectedProcs) {
            str += sp.getName() + "_";
        }
        System.out.print(str);
    } else {
        System.out.println("selectedProcs is null");
    }
}

public ProcStatDataModel getProcStatus() {
    return procStatus;
}

public SingleProcess[] getSelectedProcs() {
    return selectedProcs;
}

public void setSelectedProcs(SingleProcess[] selectedProcs) {
    this.selectedProcs = selectedProcs;
}
}

我之前尝试过像this 一样附加rowCheckListener,但没有成功。

另外,我尝试像this 一样添加f:view contentType="text/html",但没有帮助。

这很奇怪,因为我对 primefaces show case 的情况做了同样的事情,而且它的行为与我的想法一样。所以我觉得这个方法还可以,我的代码应该有问题。

感谢任何帮助。提前致谢。

【问题讨论】:

  • 你调试了代码,你从哪里得到错误?它是否进入 setSelectedProcs()?而且,您没有在 bean 中设置任何 pid。也许 bean 无法通过 pid 找到您的行?我的 Eclipse 没有验证 ' 而不是 ",但我不知道它是否相关。

标签: checkbox primefaces datatable jsf-2.2


【解决方案1】:

我做了一些更改,并且成功了。不确定,哪个是解决方案。

1) 将所有的 ' 更改为 "。

2) 我认为数据表的value="#{indexBean.procStatus}" 是错误的。我将其更改为类中 ArrayList 的名称。于是,变成了value="#{indexBean.procStatus.mylist}"

3) 添加了一个 ajax 监听器,就像你在问题中提到的那个。 &lt;p:ajax event="rowSelectCheckbox" listener="#{indexBean.check}" /&gt;.

4) 将pid 添加到构造函数中,这将是我们的rowKey。

5) 现在,投票打印数组。

结果xhtml如下:

<h:head>
    <title>System Monitor</title>

</h:head>

<h:body>
    <h:form>
        <p:poll interval="1" listener="#{indexBean.printSelect()}"/> 
    </h:form> 

    <h:form>     

        <p:dataTable id="data" var="proc" value="#{indexBean.procStatus.mylist}"
                     rowKey="#{proc.pid}" selection="#{indexBean.selectedProcs}">
                     <p:ajax event="rowSelectCheckbox" listener="#{indexBean.check}"   />
            <p:column>
                <f:facet name="header">
                    <h:outputText value="Process Name"/>
                </f:facet>
                <h:outputText styleClass="outputCell" id="pname" value="#{proc.name}"/>
            </p:column>
            <p:column selectionMode="multiple"/>
        </p:dataTable>

    </h:form>
</h:body>
</ui:composition>

豆子:

@ManagedBean(name = "indexBean")
@ViewScoped
public class indexBean implements Serializable {
private ProcStatDataModel procStatus;
private SingleProcess[] selectedProcs;

@PostConstruct
public void loadProcStat() {
    List<SingleProcess> temp = new ArrayList<SingleProcess>();
    temp.add(new SingleProcess("test1",1));
    temp.add(new SingleProcess("test2",2));
    temp.add(new SingleProcess("test3",3));
    procStatus = new ProcStatDataModel(temp);
}

public void printSelect() {
    if (selectedProcs != null) {
        String str = "";
        for (SingleProcess sp : selectedProcs) {
            str += sp.getName() + "_";
        }
        System.out.print(str);
    } else {
        System.out.println("selectedProcs is null");
    }
}

public ProcStatDataModel getProcStatus() {
    return procStatus;
}

public SingleProcess[] getSelectedProcs() {
    return selectedProcs;
}

public void setSelectedProcs(SingleProcess[] selectedProcs) {
    this.selectedProcs = selectedProcs;
}
public void check(SelectEvent event) {
    System.out.println("in check");
}
}

【讨论】:

  • 我按照你在 3 和 4 中所说的做了(因为我不明白你在 1 和 2 中的意思)并且它解决了问题。但是,当涉及到我的项目(更复杂)时,复选框会在我单击复选框后几秒钟(甚至几分钟)发送信息。我想知道这是否与性能有关?但是这段时间还是调用了轮询(发回时间),所以不知道是不是有什么问题……
  • 您能检查一下我的问题出在哪里吗?我不知道为什么它不起作用,我快疯了..drive.google.com/file/d/0B5ye4CP3K_a3aTdDblJJei1IeHc/…
  • 对不起,上面的文件有误,这里是正确的:drive.google.com/file/d/0B5ye4CP3K_a3cTZFV3l2SHhYTGc/…
  • 我遇到了同样的问题.. 你的 3 号解决了它。
猜你喜欢
  • 2012-12-14
  • 2013-06-23
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 2012-11-19
  • 1970-01-01
  • 2012-08-16
相关资源
最近更新 更多