p:datatable 中的 p:selectmanycheckbox 覆盖选择

p:selectmanycheckbox in p:datatable overrides selections

第一张图片显示了数据表中两个复选框的选择。显示的数据表有两行。在该行的第一个复选框中,您可以看到选择列表的括号。唯一的动作是选择复选框。而已。

现在,当我重新加载页面或单击底部的按钮时,状态会发生变化,如第二张图所示。

选择列表中只有最后一行复选框的选择。 所以我在想,是不是选择列表和它的managed bean有问题。

我在复选框上尝试了一个更改侦听器,但我无法获取复选框的状态,选中或未选中。 所以我又把它删除了。

<p:datatable>...
<p:rowExpansion>#{pathSearch.selectedSignalList1}
                    <p:selectManyCheckbox id="signalSel" value="#{pathSearch.selectedSignalList1}">
                        <p:ajax listener="#{pathSearch.changeSignalListener1}" />
                        <f:selectItems value="#{pathDistSel.availableSignalList}"
                            var="sig" itemValue="#{sig.label}___#{sig.idS}" itemLabel="#{sig.label}" />
                    </p:selectManyCheckbox>
                </p:rowExpansion>

Bean 片段

@ManagedBean
@SessionScoped
public class PathSearch implements Serializable {
private List<Signal> selectedSignalList1;
getter, setter...
}

如果有人有想法,我会很高兴,我的想法错误在哪里。也许你有这样的例子。

通过使用

<p:selectManyCheckbox id="signalSel" value="#{pathSearch.selectedSignalList1}">
     <p:ajax listener="#{pathSearch.changeSignalListener1}" />
     <f:selectItems value="#{pathDistSel.availableSignalList}"
         var="sig" itemValue="#{sig.label}___#{sig.idS}" itemLabel="#{sig.label}" />
</p:selectManyCheckbox>

在行扩展中,每行中的选择列表指向相同属性,selectedSignalList1.您需要在那里使用 list/array 并将行索引作为键,或者使用散列图和业务键。所以像

<p:datatable ... rowIndex="signalIndex">
    <p:selectManyCheckbox id="signalSel" value="#{pathSearch.selectedSignalList[signalIndex]}">
         <p:ajax listener="#{pathSearch.changeSignalListener}" />
         <f:selectItems value="#{pathDistSel.availableSignalList}"
             var="sig" itemValue="#{sig.label}___#{sig.idS}" itemLabel="#{sig.label}" />
    </p:selectManyCheckbox>
</datatable>

并在 bean 中

@ManagedBean
@SessionScoped
public class PathSearch implements Serializable {
    private ArrayList<List<Signal>> selectedSignalList = new ArrayList<>();
    getter, setter...
}

这样,p:rowexpansion 中的每个 p:selectManyCheckbox 都有自己的支持本地选择的列表

你在提交时做了什么,以及当你需要加载提交的数据时如何聚合或恢复,例如从数据库中提取数据并将其显示在屏幕上由您来实现。