当页面刷新、加载、排序、分页时,需要有关选择 primefaces 数据表第一行的正确方法的帮助
<p:dataTable id="clientTable" widgetVar="clientTableVar"
var="client"
value="#{maintenanceAccountController.clientLazyDataModel}"
paginator="true" rows="10"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {CurrentPageReport}"
rowsPerPageTemplate="5,10,20" paginatorPosition="bottom"
pageLinks="5" lazy="true" sortBy="#{client.cclnCode}"
sortOrder="descending"
selection="#{maintenanceAccountController.selectedClient}"
selectionMode="single" filterDelay="500">
<p:column id="cclnCodeColumn" headerText="Client Code"
sortBy="#{client.cclnCode}" filterBy="#{client.cclnCode}"
filterMaxLength="10">
<h:outputText value="#{client.cclnCode}" />
<f:event listener="#{maintenanceAccountController.saveAccount}"
type="preRenderView"></f:event>
</p:column>
<p:column id="cclnNamenColumn" headerText="Client Name"
sortBy="#{client.cclnName}" filterBy="#{client.cclnName}"
filterMaxLength="50">
<h:outputText value="#{client.cclnName}" />
</p:column>
</p:dataTable>
我目前通过在我的托管 bean 中使用这个片段来解决这个问题,它实际上选择并突出显示该行。
之所以起作用,是因为在刷新页面时选定的客户端为空,而分页、排序和过滤会自动将选定的客户端设置为空。因此,当表试图找到选定的客户端时,如果逻辑被执行,我可以选择表的第一行。
但我只是让我的 getter 成为一个 setter,并且选定的行不会触发 row selected 事件(将在另一个问题中问这个问题)。
public MaintenanceAccountClient getSelectedClient()
{
if (selectedClient == null)
{
int count = clientLazyDataModel.getRowCount();
int index = clientLazyDataModel.getRowIndex();
if (index < 0 && count > 0)
{
clientLazyDataModel.setRowIndex(0);
selectedClient = clientLazyDataModel.getRowData();
}
}
return selectedClient;
}
请注意,我使用的是 LazyDataModel,因此如果我没记错的话,客户端列表只会在 RenderPhase 加载。
我真的可以使用一些帮助。示例代码将不胜感激。
PrimeFaces 3.5 JSF 2.1