2016-03-09 78 views
1

我使用primefaces版本5.2和jsf版本2.2.6。如何使用拖放Primefaces對數據表中的列進行重新排序

我有一個數據表,我想通過拖放來重新排列列。除此之外,我還有列切換功能,可以隱藏列。列的重新排序和隱藏保存到數據庫中。

對我來說,如果在特定的位置是隱藏的列,我可以拖動被拖動的列在隱藏的位置之後或之前是沒有問題的。

我用下面的AJAX事件:

<p:ajax event="colReorder" listener="#{transactionsPage.onColumnReorder}"/> 

和方法簽名是這樣的:

public void onColumnReorder(AjaxBehaviorEvent event) 

如果我可以用ReorderEvent得到的fromIndex元素範圍,它會一直很容易處理這種情況,但不幸的是,這個事件只能用於拖放行而不能用於列。

有沒有辦法找出這些索引?即使只有fromIndex就足夠了。

+0

https://github.com/primefaces /primefaces/blob/master/src/main/java/org/primefaces/component/datatable/feature/DraggableColumnsFeature.java有助於我思考!但是這個問題有重複。讓我找到它 – Kukeltje

+0

Duplicate找不到...對不起 – Kukeltje

回答

1

我設法找到一個解決方案,也許它可能對未來某個人有所幫助。

因爲我沒有找到用於重新排序列的fromIndex和toIndex的索引(只有這樣的重新排序行的索引,它們與ReorderEvent一起工作),我從AjaxBehaviorEvent獲取數據表,並從中獲得列並覆蓋數據庫列中重新排序的列的這些索引,然後我可以稍後使用重新排序的列來恢復視圖。

從XHTML頁面觸發事件的代碼如下所示:

<p:ajax event="colReorder" listener="#{transactionsPage.onColumnReorder}"/> 

的託管bean的代碼看起來是這樣的:

public void onColumnReorder(AjaxBehaviorEvent event) { 
    DataTable table = (DataTable) event.getSource(); 

    List<ViewAttributes> allViewAttributesList = loadAllViewAttributes(); 

    for (int i = 0; i < table.getColumns().size(); i++) { 
     UIComponent colComponentDestination = (UIComponent) table.getColumns().get(i); 

     //allViewAttributes is the list of columns from the database, in which I set the new indexes 
     for (int j = 0; j < allViewAttributesList.size(); j++) {  
      ViewAttributes viewAttrSource = allViewAttributesList.get(j); 
      if (viewAttrSource.getColumnName().equals(colComponentDestination.getId()) && i != viewAttrSource.getPosition()) { 
       viewAttrSource.setPosition(new Long(i)); 

       //save column with new index in the database     
       getServiceManager().getViewService().getViewDao().update(viewAttrSource); 
      } 
     } 
    } 
} 
+0

不錯的一個...小編輯... – Kukeltje

+0

謝謝你@Kukeltje! – uzzi

相關問題