如何使用拖放Primefaces

时间:2016-03-09 14:35:12

标签: events primefaces datatable drag-and-drop

我使用的是primefaces 5.2和jsf 2.2.6版。

我有一个数据表,我想通过拖放重新排序列。除此之外,我还有列切换功能,我可以用它来隐藏列。列的重新排序和隐藏将保存到数据库中。

对我而言,如果特定位置是隐藏列,我可以在隐藏列的位置之前或之前删除拖动的列。

我使用以下ajax事件:

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

,方法签名如下所示:

public void onColumnReorder(AjaxBehaviorEvent event)

如果我可以使用ReorderEvent来获取fromIndex和toIndex,那么处理这种情况会非常容易,但不幸的是,这个事件只能用于拖放行而不是列。

有没有办法找出这些索引?即使只有fromIndex也足够了。

1 个答案:

答案 0 :(得分: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);
            }
        }
    }
}