2015-04-23 31 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>