我使用的是primefaces 5.2和jsf 2.2.6版。
我有一个数据表,我想通过拖放重新排序列。除此之外,我还有列切换功能,我可以用它来隐藏列。列的重新排序和隐藏将保存到数据库中。
对我而言,如果特定位置是隐藏列,我可以在隐藏列的位置之前或之前删除拖动的列。
我使用以下ajax事件:
<p:ajax event="colReorder" listener="#{transactionsPage.onColumnReorder}"/>
,方法签名如下所示:
public void onColumnReorder(AjaxBehaviorEvent event)
如果我可以使用ReorderEvent来获取fromIndex和toIndex,那么处理这种情况会非常容易,但不幸的是,这个事件只能用于拖放行而不是列。
有没有办法找出这些索引?即使只有fromIndex也足够了。
答案 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);
}
}
}
}