2015-04-23 53 views
3

我有一个数据表,以及排序,过滤器和columntoggler。 首先,当我选择并取消选择同一页中的一列时,一切都很好。Primefaces ColumnToggler does not与分页

enter image description here

enter image description here 正如你所看到的,我的第一个栏已经消失

我在这里的问题是,当我去到下一个页面分页工具,如果我要取消选择一列,它显示只有列标题,而不是它们的行,如下所示: enter image description here 现在显示了最初的隐藏列,但是我们已经有了空白。最后一列现在是空的,第一列是第二列的值。

这是我的数据表结构:

<p:dataTable id="datatable" var="mon" value="#{X.resultQuery}" 
         first="#{dataTableController.first}" 
         resizableColumns="true" 
         rows="20" 
         paginator="true" 
         paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
         rowsPerPageTemplate="30,40,50" 
         draggableColumns="true" 
         paginatorPosition="bottom" 
         selectionMode="single" rowKey="#{mon[4]}" 
         > 
       <f:facet name="header"> 
        <p:commandButton id="toggler" type="button" value="Hide Columns" icon="ui-icon-calculator" /> 
        <p:columnToggler datasource="datatable" trigger="toggler"> 
         <p:ajax event="toggle" listener="#{columnTogglerController.onToggle}" /> 
        </p:columnToggler> 
       </f:facet> 

这是我ColumnTogglerController:

public class ColumnTogglerController implements Serializable { 

private List<Boolean> list; 

/** 
* Creates a new instance of ColumnTogglerController 
*/ 
public ColumnTogglerController() { 
} 

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

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

@PostConstruct 
public void init() { 
    setList(Arrays.asList(true, true, true, true, true, true, true, true, true, true, true)); 
} 

public void onToggle(ToggleEvent e) { 
    list.set((Integer) e.getData(), e.getVisibility() == Visibility.VISIBLE); 

} 

}

基本上我的计划是基于此博客: http://blog.primefaces.org/?p=3341

谢谢为你提供帮助。

回答

3

我恰好遇到这个最近。 blog实际上工作。问题是draggableColumns="true"使列的索引改变。所以,相反名单我用两张地图:

private final Map<String, Boolean> colVisibilityMap = new HashMap<>(); 
private final Map<Integer, String> colIndexMap = new HashMap<>(); 

在初始化过程中,我设置了colIndexMap和colVisibilityMap (我使用的ID /的clientId为重点)。 在列重新排序上,我更新colIndexMap。 然后在切换时,我根据colIndexMap更新colVisibilityMap。

public Map<String, Boolean> getColVisibilityMap() { 
    return Collections.unmodifiableMap(colVisibilityMap); 
} 

private String getColumnId(String fullId) { 
    String[] idParts = fullId.split(":"); 
    return idParts[idParts.length - 1]; 
} 

@PostConstruct 
public void init() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    DataTable table = (DataTable) context.getViewRoot().findComponent(":form:tableid"); 
    List<UIColumn> columns = table.getColumns(); 
    for (int i = 0; i < columns.size(); i++) { 
     final String columnId = this.getColumnId(columns.get(i).getClientId()); 
     colIndexMap.put(i, columnId); 
     colVisibilityMap.put(columnId, true); 
    }); 
} 

public void onColumnReorder(AjaxBehaviorEvent e) { 
    List<UIColumn> columns = ((DataTable) e.getSource()).getColumns(); 
    for (int i = 0; i < columns.size(); i++) { 
     this.colIndexMap.put(i, this.getColumnId(columns.get(i).getClientId())); 
    } 
} 

public void onToggle(ToggleEvent e) { 
    // If we use list here, e.getData() may not be the correct index due to column reordering. 
    this.colVisibilityMap.put(this.colIndexMap.get((Integer) e.getData()), e.getVisibility() == Visibility.VISIBLE); 
} 

这是我的JSF页面的代码:

<p:dataTable id="tableid" widgetVar="tableWidgetVar" draggableColumns="true" paginator="true" 
<!-- ommitted other attributes --> 
> 
    <p:ajax event="colReorder" listener="#{bean.onColumnReorder}"/> 
    <f:facet name="header"> 
     <p:commandButton id="toggler" type="button" value="Columns"/> 
     <p:columnToggler datasource="tableid" trigger="toggler"> 
      <p:ajax event="toggle" listener="#{bean.onToggle}"/> 
     </p:columnToggler> 
    </f:facet> 
    <p:column id="col1" visible="#{bean.colVisibilityMap['col1']}"> 
     <!-- ommitted --> 
    </p:column> 
    <p:column id="col2" visible="#{bean.colVisibilityMap['col2']}"> 
     <!-- ommitted --> 
    </p:column> 
    <!-- and so on... --> 
</p:dataTable>