具有列切换器的Primefaces数据表与列上的排序功能冲突

dav*_*arm 4 primefaces jsf-2

我有一个具有列切换器的数据表。当我取消选中列并在字段上排序时,表是错误的。弹出未选中字段的标题,并且所有数据向左移动,从而使1列留空。

我的table.xhtml文件:

<h:form>    
    <p:dataTable id="registrations" var="registration" tableStyle="table-layout: auto;" widgetVar="registrationsTable" 
        value="#{overviewBean.listOfRegistrations}" 
        filteredValue="#{overviewBean.filteredListOfRegistrations}" emptyMessage="No registrations found with given criteria" >
        <f:facet name="header">
            <p:outputPanel style="text-align:left;">
                <h:outputText value="Search all fields: " />
                <p:inputText id="globalFilter" onkeyup="PF('registrationsTable').filter()" style="width:150px;" placeholder="Enter keyword"/>

                <p:commandButton id="toggler" type="button" value="Columns"  icon="ui-icon-calculator" style="float:right;"/>
                <p:columnToggler datasource="registrations" trigger="toggler" >
                </p:columnToggler>
            </p:outputPanel> 
        </f:facet>


        <p:column headerText="Active" visible="false">
            <h:outputText value="Y" />
        </p:column>

        <p:column headerText="Firstname" filterBy="#{registration.firstname}" filterStyle="display:none" sortBy="#{registration.firstname}">
            <h:outputText value="#{registration.firstname}" />
        </p:column>

        <p:column headerText="Lastname" filterBy="#{registration.lastname}" filterStyle="display:none" sortBy="#{registration.lastname}">
            <h:outputText value="#{registration.lastname}" />
        </p:column>

    </p:dataTable>
</h:form>
Run Code Online (Sandbox Code Playgroud)

dav*_*arm 5

我在此博客文章中找到了答案:http : //blog.primefaces.org/?p=3341

解决方案是将Visibility所有列的状态保留在备用Bean中。

切换器必须在您的支持Bean中触发onToggle函数:

<p:columnToggler datasource="registrations" trigger="toggler" >
    <p:ajax event="toggle" listener="#{overviewBean.onToggle}" />
</p:columnToggler>
Run Code Online (Sandbox Code Playgroud)

每列必须由备用Bean中的布尔值列表设置:

<p:column headerText="Entry date" sortBy="#{registration.entryDate}" visible="#{overviewBean.list[0]}">
    <h:outputText value="#{registration.entryDate}">
        <f:convertDateTime pattern="dd/MM/yyyy" />
    </h:outputText>
</p:column>
Run Code Online (Sandbox Code Playgroud)

在支持bean中,您必须具有一个布尔值列表,该列表表示每个字段的可见性:

private List<Boolean> list;

public List<Boolean> getList() {
    return list;
}

public void setList(List<Boolean> list) {
    this.list = list;
}

public void onToggle(ToggleEvent e) {
    list.set((Integer) e.getData(), e.getVisibility() == Visibility.VISIBLE);
}
Run Code Online (Sandbox Code Playgroud)

@PostConstruct方法中,您必须初始化以下bean列表:

list = Arrays.asList(false, true, true);
Run Code Online (Sandbox Code Playgroud)