我有一个动态数据表列表,我需要为每个表的单行启用行选择。 下面的代码仅当用户选择最后一个数据表的一行时才起作用,可能是因为 Ajax 事件被替换并且只有最后一个事件起作用。
如果用户从另一个数据表中选择一行,则会调用 onRowSelect 方法,但变量
NullPointerException
上有一个 selectedRow
。
也许我需要在Java bean中创建多个onrowselect方法,每个数据表一个,但该表的数量是可变的。
如何解决这个问题?
<c:forEach items="#{azPerformancePrenPubAll.selectedCompanyTemp}" var="companyCode" varStatus="loop">
<p:accordionPanel id="acc_#{companyCode}" widgetVar="accordionAziendale_#{companyCode}" activeIndex="-1">
<p:tab title="#{azPerformancePrenPubAll.selectedCompanyName.get(loop.index)}">
<p:dataTable id="tablePerformance_#{companyCode}" rendered="#{!azPerformancePrenPubAll.isCompanyVisible}"
widgetVar="tablePerformance" var="performance" value="#{azPerformancePrenotatiPubAll.listPerformances.get(loop.index)}"
styleClass="perfDataTable no-border" rowIndexVar="rowIndex"
selectionMode="single" selection="#{azPerformancePrenPubAll.selectedRow}" rowKey="#{performance.id}">
<p:ajax event="rowSelect" listener="#{azPerformancePrenPubAll.onRowSelect}" update="formPerformance,pageSubDescription,pageDescription"/>
...
如果用户从数据表中选择一行而不是最后一行,则在循环中使用公共
selectedRow
变量可能会导致 NullPointerException
。
您可以尝试在 backing bean 中创建一个 Map 来保存每个
selectedRow
的 companyCode
。
private Map<String, YourDataType> selectedRows = new HashMap<>();
然后在您的 XHTML 中:
selection="#{azPerformancePrenPubAll.selectedRows[companyCode]}"
此外,您还可以将
companyCode
或任何其他唯一标识符传递给侦听器中的方法。
<p:ajax event="rowSelect" listener="#{azPerformancePrenPubAll.onRowSelect(companyCode)}" />
在您的 Java bean 中:
public void onRowSelect(String companyCode) {
// Logic here
}
当您使用
widgetVar="tablePerformance"
时,请确保这对于每个循环迭代也是唯一的。