Primefaces LazyLoading表默认选择First Row

时间:2013-05-17 10:43:26

标签: java jsf web 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中使用此代码段解决了这个问题,它实际上选择并突出显示该行。

它的工作原理是因为刷新页面时所选客户端为空,而分页,排序和过滤会自动将所选客户端设置为空。因此,当表尝试查找所选客户端时,执行if逻辑并且我可以选择表的第一行。

但我只是让我的getter成为一个setter而且所选行不会触发行选择事件(将在另一个问题中询问该问题)。

    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

1 个答案:

答案 0 :(得分:1)

我也面临同样的问题。我必须在每个页面上选择第一行选择。我的解决方案很简单

 <p:ajax event="rowSelect" listener="#{protoCnt.setAdditionDetail()}" update=":rightTabForm"/>
 <p:ajax event="page" oncomplete="myTblWidget.selectRow(0);"/>

我有两个事件所以在页面上选择event =“page”由于myTblWidget.selectRow(0)而调用; rowSelect侦听器调用setAdditionDetail()

    public void setAdditionDetail() {   
    if (selected== null) {
        selected= myLazyModelList.get(0);
    } 
}

所以它选择bean和客户端的行